最近我朋友疯狂迷恋韩国的偶像团体防弹少年团,于是拜托我帮忙写一段程序实时检测韩国新闻网站instiz旗下两个板块pt和clip,当出现自家idol的新闻时,程序能自动发微博通知她。我觉得这个功能还是蛮有意思的,程序实现起来并不复杂,而且妹子的请求不好意思拒绝,所以就答应她了。说干就干,程序实现如下。

模拟登录微博

发微博的功能如果借助微博的api其实很简单,然而当我注册站内应用获得APPKEY和ACCESS_TOKEN时,审核了2天竟然被拒了(当然也有可能是自己填的太随意哈)。不过懒得等的我干脆自己模拟浏览器登录发微博。

首先我们需要分析模拟登陆需要提交的表单,打开chrome分析登录时https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19) 需要提交的表单,可以发现有以下信息需要我们注意:

其中servertime,nonce,rsakv应该来自之前get到的数据,翻之前的url请求,注意到有一个prelogin的url值得我们注意,观察返回来的数据:

{"retcode":0,
"servertime":1537519779,
"pcid":"gz-7b560c8c199aa33a6b201149095489a4d147","nonce":"H6ITP0","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443",
"rsakv":"1330428213",
"is_openlock":0,
"lm":1,
"smsurl":"https:\/\/login.sina.com.cn\/sso\/msglogin?entry=weibo&mobile=18800190793&s=f0cd668a3b51745b707c94f41a090c98",
"showpin":0,
"exectime":110}

里面也确实有我们需要的数据,那么另外两个su以及sp应该就是加密之后的username和password了,然而网站如何加密的呢?

仔细观察的话会有一个ssologin.js的文件在prelogin和login中都有出现,猜测加密应该是在这里面完成的,这个文件很大,但我们只需要搜我们自己想要的,果然找到了如下代码:

request.su=sinaSSOEncoder.base64.encode(urlencode(username))RSAKey.setPublic(me.rsaPubkey,"10001");password=RSAKey.encrypt([me.servertime,me.nonce].join("\t")+"\n"+password)OK,将这段js代码翻译成python代码就可以了,完整的代码如下所示:importrequestsimportbase64importreimportrsaimportjsonimportbinasciiimporttimeclassweibo(object):def__init__(self, username, password):self.username = usernameself.password = passworddefencrypted_username(self):# 对用户名加密,返回sureturnbase64.b64encode(bytes(self.username, encoding="utf-8")).decode("utf-8")defencrypted_password(self):# 对密码加密,返回spdata=self.get_prelogin_data()rsa_e=65537password_str=str(data["servertime"])+"\t"+str(data["nonce"])+"\n"+self.passwordkey=rsa.PublicKey(int(str(data["pubkey"]),16), rsa_e)password_encrypt=rsa.encrypt(password_str.encode("utf-8"), key)returnbinascii.b2a_hex(password_encrypt).decode("utf-8")defget_prelogin_data(self):# 以json格式返回prelogin的数据url ='http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&'+ self.encrypted_username() +'&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)'withrequests.Session()assess:r=sess.get(url, timeout=2)pattern = re.compile(r"\((.*)\)")data = pattern.search(r.text).group(1)json_data=json.loads(data)returnjson_datadeflogin_and_send(self, text):prelogin_data=self.get_prelogin_data()data={"entry":"weibo","gateway":"1","from":"","savestate":"7","qrcode_flase":"false","useticket":"1","pagerefer":r"http://passport.weibo.com/visitor/visitor?entry=miniblog&a=enter&url=http%3A%2F%2Fweibo.com%2F&domain=.weibo.com&ua=php-sso_sdk_client-0.6.14","vsnf":"1","su":self.encrypted_username(),"service":"miniblog","servertime":prelogin_data['servertime'],"nonce":prelogin_data['nonce'],"pwencode":"rsa2","rsakv":prelogin_data['rsakv'],"sp":self.encrypted_password(),"sr":"1680*1050","encoding":"UTF-8","prelt":"122","url":"https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack","returntype":"META"}url ='http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"}#设置发微博时需要提交的表单weibo_data={"location":"v6_content_home","appkey":"","style_type":"1","pic_id":"","text": text,"pdetail":"","rank":"1",#设置仅自己可见,如果对所有人可见改为0"rankid":"","module":"stissue","pub_type":"dialog","_t":"0",}weibo_headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36","referer":""}withrequests.Session()assess:r=sess.post(url, headers=headers, data=data, timeout=2, allow_redirects=True)pattern1=re.compile(r"location\.replace\(\'(.*)\'\)")pattern2=re.compile(r"userdomain\":\"(.*)\"},")redirent_url=pattern1.search(r.content.decode("GBK")).group(1)r1=sess.get(redirent_url)login_url="https://weibo.com/"+ pattern2.search(r1.content.decode("utf-8")).group(1)r2=sess.get(login_url)weibo_headers["referer"]=r2.urllogin_url1="https://weibo.com/aj/mblog/add?ajwvr=6&__rnd="+str(int(time.time()*1000))r3=sess.post(login_url1, headers=weibo_headers, data=weibo_data, timeout=2)if(r3.status_code==requests.codes.ok):print("send weibo successfully!!!")else:print("there is something wrong!!!")if__name__ =='__main__':wb=weibo("***","***")wb.login_login_send("这是一段测试文本")

然后你不用申请key也能写个自动发微博的程序了,当然能申请key最好啦。

监测新闻网站,自动发微博

这一点实现很简单,定义几个关键词,每隔60s爬取一次新闻网站,如果新出的新闻标题中包含关键词,就把新闻的标题和链接发到微博,程序的实现如下:

importreimportrequestsfrombs4importBeautifulSoupimporttimefromWeiboimportweiboKEYWORDS = ["BTS","방탄소넌단","김석진","김남준","민윤기","정호석","박지민","김태형","전정국"]classNewsSpider(object):"""docstring for NewsSpider"""def__init__(self):super(NewsSpider, self).__init__()self.url=["http://www.instiz.net/pt","http://www.instiz.net/clip"]self.newslist=[]self.wb=weibo("***","***")print("complete initializing")defcheckkeywords(self, title):isinclude=FalseforkeywordsinKEYWORDS:ifkeywordsintitle:isinclude=Truereturnisincludedefupdatenewslist(self, url):withrequests.Session()assess:r=sess.get(url, timeout=2)soup=BeautifulSoup(r.content,"lxml")listsubject=soup.find_all(id="subject")forsubjectinlistsubject:pattern = re.compile(r'\d{6,7}')href=subject.a.get('href')id=pattern.search(href)ifid.group():title=subject.a.textifself.checkkeywords(title)andid.group()notinself.newslist:self.newslist.append(id.group())self.updateWeibo(url+"/"+id.group(), title)defrunforever(self):i=0failnum=0while(1):try:self.updatenewslist(self.url[i])# 两个板块,交替执行failnum=0exceptExceptionase:# 如果由于某些问题连续失败,比如ip被ban,记录失败次数,连续60次失败通知failnum=failnum+1iffailnum>=60:print("There is something wrong with your code!!!")failnum=0finally:i=(i+1)%2time.sleep(30)defupdateWeibo(self, newsurl, newstitle):text="你的偶像们又有新消息了:"+newstitle+"。详情查看链接->"+newsurlprint(text)self.wb.login_and_send_message(text)if__name__ =='__main__':ns=NewsSpider()ns.runforever()

具体效果如图:

后记

当我帮程序交到妹子手上 ,就没有然后了。果然是badiaowuqing啊~

这波教程不点个赞,不关注一下说不过去吧?


对爬虫技术感兴趣的同学可以加群705673780,一起探讨,交流学习~


这边是我的一个微信公众号,分享Python最新技术,学习方法的一个公众号,有兴趣的朋友可以关注一哈

同样是追星 ,为什么他们能这么做相关推荐

  1. 从“追星”到“饭圈”:人类偶像崇拜发展简史

    最近,科技圈.传媒圈.公关圈.电竞圈等都纷纷向饭圈发来贺电,强势围观. "出圈"的原因,则是AO3.LOFTER.STEAM等大众平台,因某明星粉丝集体举报而陷落,甚至云盘.豆瓣等 ...

  2. 网易云信携手SNH48 GROUP,打造在线追星新体验

    8月15日,"创造炙热的青春"SNH48 GROUP第七届偶像年度人气总决选刚刚落下帷幕.这是SNH48 GROUP一年一度的巅峰盛事--粉丝们用投票的形式,决定了未来一年成员的排 ...

  3. 北京大兴国际机场官微追星蔡徐坤,网友大怒,官方道歉...

    先聊两句应景的,此时此刻的你,心情是不是这样的呢? 千盼万盼终于盼来了十一长假,谁能不激动呢? 好了,言归正传~ 9月25日,北京大兴国际机场正式启用,这是北京第三座大型机场,用时5年,耗资800亿人 ...

  4. 已故女孩在微博“复生”追星,你的数据资产谁说了算?

    来源:大数据文摘出品 作者:刘俊寰 你有没有想过,自己去世后,社交媒体账号将会怎样? 最近,微博名为"努力做个小太阳的晨小晨"的账号就遭遇了这个危机,这件事还和目前最"不 ...

  5. 杨超越杯编程大赛上热搜:不懂技术真不敢追星

    别惊讶!人工智能时代即将到来! https://edu.csdn.net/topic/ai30?utm_source=cxrs_bw 作为程序员,粉丝追星似乎与"麻烦"相挂钩.例如 ...

  6. 深访杨超越杯编程大赛发起人 还原硬核粉丝追星全过程

    欢迎关注"创事记"的微信订阅号:sinachuangshiji 文/石灿 来源:刺猬公社(ID:ciweigongshe) "大家加油,我要退群了,被老婆看到不好.&qu ...

  7. java计算机毕业设计追星网站源码+数据库+系统+lw文档

    java计算机毕业设计追星网站源码+数据库+系统+lw文档 java计算机毕业设计追星网站源码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea ...

  8. 追星必备神器 -- 爱豆APP

    软件简介 爱豆,是一款专门为粉丝打造的追星手机应用,同时也是粉丝之间的交流社区.这款应用到目前为止已经开启了23位热门明星的动态,粉丝可以登录爱豆.通过爱豆了解自己喜欢的明星的最新动态,同时也可以在爱 ...

  9. 程序员追星如此硬核?杨超越杯编程大赛获奖项目大盘点!

    不久前,微博热搜火了一个让程序员们一脸懵逼的话题,那就是 #杨超越杯编程大赛#,硬核男粉的追星之路由此起航. 比赛从开始到完结,基本每一个比赛节点都出现在微博热搜,当追星遇上程序员,当饭圈遇上码农,跨 ...

  10. 从AI、5G谈到理智追星,互联网大会首日还有哪些神仙言论?

    数据猿--大数据产业创新服务媒体 数据猿官网 | www.datayuan.cn 今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+ ...

最新文章

  1. java hibernate oracle,Java笔记8:Hibernate连接Oracle
  2. 汇总|Yolo开源项目
  3. UA MATH566 用Basu定理证明统计量不完备
  4. 明早1点去青岛,可能要两天不能写博客了
  5. typescript 怎么表示当前时间减一个月_TypeScript类型元编程:实现8位数的算术运算...
  6. 2021-01-24
  7. 60-140-040-使用-DataSink-Data Sink 介绍
  8. %3cphp和%3c php_phpcmsv9后台登录绕过
  9. Python图片爬虫
  10. 如何使用EDI系统解决对接多工厂的问题?
  11. Secure CRT 配色方案
  12. Linux-2.6 open()打开文件涉及的内核处理和数据结构分析
  13. 路由器桥接dns服务器未响应,360路由器无线桥接的设置方法(电脑)?
  14. unity animator动画播放完毕后执行
  15. windows通过浏览器远程连接Linux服务器的jupyter
  16. 机器学习:什么是无监督学习(Unsupervised Learning)?
  17. 前端:简述表单提交前如何进行数据验证
  18. Unity 图形 - 摄像机
  19. 云小蜜人工智能训练师
  20. 每日新闻 | 特斯拉“太空跑车”完成第一圈绕日飞行 向火星靠近

热门文章

  1. 3. C++四大函数
  2. 余额宝弱爆了,首支可ATM取现货币基金面世
  3. 好东西大家分享: 微软界面设计指导
  4. 我开始用心的寂寞妆点着梦的沧桑
  5. Animation和Animator 的区别
  6. albiononline未能连接服务器,西游记之大圣归来无法连接服务器解决方案分享
  7. FTP主动与被动传输引发的协议那些事
  8. matlab fmincon 精度,fmincon与quadprog误差
  9. 三级嵌入式准备(三)
  10. vue.js WebSocket connection to ‘ws://localhost:3000/‘ failed: WebSocket is closed due to suspension.