前言

最近准备打算玩玩微博,关注了几个大V。但平时都习惯用微信了,于是就想着怎么将微博的文章实时同步到微信,于是就有了下面这一系列操作。

步入正题

要想实现上述过程,总共包含以下几个步骤:
1.登录手机网页版微博
2.获取被监听博主的发文信息
3.循环监听发文信息

实现步骤

1.首先我们登录手机网页版微博

地址:https://m.weibo.cn/。此处我们选择:账号密码登陆。

正确输入账号密码后,我们用抓包工具(Fiddler)分析一下


发现只要用户名和密码正确,既返回200且json部分的retcode会返回20000000

登录部分代码

def login(self, username, password):"""登录新浪:param username::param password::return:"""# 登录URLlogin_url = 'https://passport.weibo.cn/sso/login'# 请求数据data = {'username': username,'password': password,'savestate': 1,'entry': 'mweibo','mainpageflag': 1}try:r = self.session.post (login_url, data=data, headers=self.headers)if r.status_code == 200 and json.loads (r.text)['retcode'] == 20000000:self.echoMsg ('Info', '登录成功! UserId:' + json.loads (r.text)['data']['uid'])else:self.echoMsg ('Error', '登陆失败!')sys.exit ()except Exception as e:self.echoMsg ('Error', e)sys.exit ()
2.获取某个博主的发文信息

登录完成之后,我们搜索想要监听的博主。

注意,上面红色圈出的部分是该用户的userid。后面会用到。

打开开发者工具,我们在network下可以看到下面两个请求。

对应url和返回数据分别为:
https://m.weibo.cn/api/container/getIndex?uid=1195242865&luicode=10000011&lfid=100103type=1&q=杨幂&type=uid&value=1195242865&containerid=1005051195242865

{"ok":1,"data":{"avatar_guide":[],"userInfo":Object{...},"fans_scheme":"[https://m.weibo.cn/p/index?containerid=231051_-_fans_intimacy_-_1195242865&luicode=10000011&lfid=1005051195242865](https://m.weibo.cn/p/index?containerid=231051_-_fans_intimacy_-_1195242865&luicode=10000011&lfid=1005051195242865)","follow_scheme":"[https://m.weibo.cn/p/index?containerid=231051_-_followersrecomm_-_1195242865&luicode=10000011&lfid=1005051195242865](https://m.weibo.cn/p/index?containerid=231051_-_followersrecomm_-_1195242865&luicode=10000011&lfid=1005051195242865)","tabsInfo":{"selectedTab":1,"tabs":[Object{...},{"id":2,"tabKey":"weibo","must_show":1,"hidden":0,"title":"微博","tab_type":"weibo","containerid":"1076031195242865","apipath":"/profile/statuses","url":"/index/my"},Object{...},Object{...},Object{...}]},"scheme":"sinaweibo://userinfo?uid=1195242865&uid=1195242865&luicode=10000011&lfid=100103type%3D1%26q%3D%E6%9D%A8%E5%B9%82&type=uid&value=1195242865&fid=1005051195242865&uicode=10000011&v_p=42","showAppTips":1}
}

https://m.weibo.cn/api/container/getIndex?uid=1195242865&luicode=10000011&lfid=100103type=1&q=杨幂&type=uid&value=1195242865&containerid=1076031195242865

{"ok":1,"data":{"cardlistInfo":Object{...},"cards":[{"card_type":9,"itemid":"1076031195242865_-_4404180250376691","scheme":"[https://m.weibo.cn/status/I1KKl1zZF?mblogid=I1KKl1zZF&luicode=10000011&lfid=1076031195242865](https://m.weibo.cn/status/I1KKl1zZF?mblogid=I1KKl1zZF&luicode=10000011&lfid=1076031195242865)","mblog":{"created_at":"08-11","id":"4404180250376691","idstr":"4404180250376691","mid":"4404180250376691","can_edit":false,"version":1,"show_additional_indication":0,"text":"<a href="https://m.weibo.cn/search?containerid=231522type%3D1%26t%3D10%26q%3D%23%E4%B8%AD%E5%9B%BD%E8%BE%BE%E4%BA%BA%E7%A7%80%23&isnewpage=1&luicode=10000011&lfid=1076031195242865" data-hide=""><span class="surl-text">#中国达人秀#</span></a> 金姨<a href='/n/金星'>@金星</a> 来评评理,是不是我比二舅先按的<span class="url-icon"><img alt=[跪了] src="//h5.sinaimg.cn/m/emoticon/icon/default/d_guile-7b3e474f7f.png" style="width:1em; height:1em;" /></span>","source":"","favorited":false,"pic_types":"","is_paid":false,"mblog_vip_type":0,"user":Object{...},"retweeted_status":Object{...},"reposts_count":44924,"comments_count":44720,"attitudes_count":103999,"pending_approval_count":0,"isLongText":false,"reward_exhibition_type":0,"hide_flag":0,"visible":Object{...},"expire_time":1565526070,"mblogtype":1,"more_info_type":0,"cardid":"star_478","extern_safe":0,"number_display_strategy":{"apply_scenario_flag":3,"display_text_min_number":1000000,"display_text":"100万+"},"content_auth":0,"hide_hot_flow":1,"pic_num":0,"mblog_menu_new_style":0,"edit_config":Object{...},"mark":"followtopweibo","weibo_position":3,"show_attitude_bar":0,"obj_ext":"828万次观看","readtimetype":"adMblog","timestamp_text":"推荐内容","promotion_info":{"display_text":"推荐内容"},"raw_text":"#中国达人秀# 金姨@金星 来评评理,是不是我比二舅先按的[跪了]","bid":"I1KKl1zZF"},"show_type":0},Object{...},Object{...},Object{...},Object{...},Object{...},Object{...},Object{...},Object{...},Object{...},Object{...}],"scheme":"sinaweibo://cardlist?containerid=1076031195242865&extparam=&uid=1195242865&luicode=10000011&lfid=100103type%3D1%26q%3D%E6%9D%A8%E5%B9%82&type=uid&value=1195242865&fid=1076031195242865&uicode=10000011&v_p=42"}
}

经过测试这个接口直接加上type和value参数访问就可以得到博主基本信息,见上面第一个返回结果, 不必加上containerid参数

而第二个接口的containerid参数则可以通过第一个接口获取。第二接口返回的就是发文信息。只是一次请求加载的发文信息,并不是所有发文信息。其中card_type=9,代表文字和图片微博。这里我们只监听文字以及图片发文信息。

我们将文章id存起来,后面我们在循环监听中,发现有新的id时。那么这篇文章就是新发的文章。

    def get_wb_info(self, wb_user_id):# 获取containeridglobal containeriduser_info = 'https://m.weibo.cn/api/container/getIndex?uid=%s&type=uid&value=%s' % (wb_user_id, wb_user_id)try:r = self.session.get (user_info, headers=self.headers)for i in r.json ()['data']['tabsInfo']['tabs']:if i['tab_type'] == 'weibo':containerid = i['containerid']except Exception as e:self.echoMsg ('Error', e)sys.exit ()# 获取发文信息self.weibo_info = 'https://m.weibo.cn/api/container/getIndex?uid=%s&type=uid&value=%s&containerid=%s' % (wb_user_id, wb_user_id, containerid)try:r = self.session.get (self.weibo_info, headers=self.headers)self.itemIds = []for i in r.json ()['data']['cards']:if i['card_type'] == 9:self.itemIds.append (i['mblog']['id'])self.echoMsg ('Info', '成功获取微博发文信息')self.echoMsg ('Info', '有 %d 篇文章' % len (self.itemIds))except Exception as e:self.echoMsg ('Error', e)sys.exit ()
3.循环监听发文信息,将新的发文发送到微信

这里我们每60s请求一次

def start(username, password, wb_user_id, wx_user_id):""":param username:微博用户名:param password:微博用户密码:param wb_user_id:微博被监听用户userid:param wx_user_id:微信接收消息userid:return:"""m = monitor ()m.login (username, password)m.get_wb_info (wb_user_id)while 1:new_wb = m.start_monitorif new_wb is not None:print (new_wb)itchat.send (new_wb['text'] + "\n" + new_wb['url'], wx_user_id)time.sleep (60)

如果发现新的发文信息,解析微博发文信息,将其返回。

 @propertydef start_monitor(self, ):wb_dict = {}try:r = self.session.get (self.weibo_info, headers=self.headers)for i in r.json ()['data']['cards']:if i['card_type'] == 9:if str (i['mblog']['id']) not in self.itemIds:self.itemIds.append (i['mblog']['id'])self.echoMsg ('Info', '发布新的文章啦!!!')wb_dict['created_at'] = i['mblog']['created_at']wb_dict['text'] = i['mblog']['text']wb_dict['source'] = i['mblog']['source']wb_dict['nick_name'] = i['mblog']['user']['screen_name']wb_dict['url'] = i['scheme']# 如果包含图片if 'pics' in i['mblog']:wb_dict['pic_urls'] = []for j in i['mblog']['pics']:wb_dict['pic_urls'].append (j['url'])return wb_dictself.echoMsg ('Info', '有 %d 篇文章' % len (self.itemIds))except Exception as e:self.echoMsg ('Error', e)sys.exit ()

登陆网页版微信,获取微信接收消息用户的userid

def wechat_login():itchat.auto_login (hotReload=True)user_info = itchat.search_friends ("元大头")return user_info[0]["UserName"]

程序入口

if __name__ == '__main__':wx_user_id=wechat_login ()wb_user_id = '被监听用户微博userid'username = '用户名'password = raw_input ('请输入微博登陆密码: ')start (username, password, wb_user_id, wx_user_id)

运行结果

郑重申明:此文仅用于学习交流使用,请勿用做商业用途。
关注公众号哦

python实时监听微博发文同步到微信相关推荐

  1. python麦克风监听_python实时监听麦克风

    首先安装pyaudio 到官网下载pa_stable_v190600_20161030.tgz (←或者直接点击下载) 2, 下载之后解压进入文件夹 3, 在文件夹下打开命令行输入以下命令 conda ...

  2. python看门狗(watchdog)、多线程、实现文件夹实时监听、日志输出、备份

    python看门狗(watchdog).多线程.实现文件夹实时监听.日志输出.备份 代码展示 import _thread from watchdog.observers import Observe ...

  3. 实时监听文本框输入 oninput、onchange与onpropertychange事件的用法和区别

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ...

  4. php监听input,jQuery如何实时监听获取input输入框的值

    jQuery实时监听获取input输入框的值,在我们日常web项目开发也常需要去实现这样的功能效果.为了作出即时动作去引导浏览者,以便提高网站的用户体验感. 下面我们就结合具体的代码示例,为大家介绍j ...

  5. python hook技术,python hook监听事件详解

    本文实例为大家分享了python hook监听事件的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- # # by oldj http://oldj.net/ # i ...

  6. Android实时监听网络状态

    Android开发实时监听网络状态变化一般有两种方法: 1. 新建一个基类BasicActivity.class,在基类中注册网络监听广播NetworkChangeReceiver.class,所有页 ...

  7. html 监听input输入框的值,利用原生JS实时监听input框输入值

    利用原生JS实时监听input框输入值 原生JS中可以使用oninput,onpropertychange,onchange oninput,onpropertychange,onchange的用法 ...

  8. vue动态获取元素距离页面顶部的高度_VUE如何实时监听元素距离顶部高度

    VUE如何实时监听元素距离顶部高度 发布时间:2020-07-30 09:09:43 来源:亿速云 阅读:150 作者:小猪 这篇文章主要讲解了VUE如何实时监听元素距离顶部高度,内容清晰明了,对此有 ...

  9. vue图片宽高自适应_Echarts图标宽度变成100px,让图表宽度随着父元素自动适应,Vue实时监听宽度的变化,这可能是史上最好的解决方案!...

    源码解读:当Echarts绘制图表计算宽度的时候,由于初始化图表设置为display: none,所以无法获取到clientWidth,而 parseInt(stl.width, 10)) 将widt ...

  10. vue获取元素距离页面顶部的距离_VUE实时监听元素距离顶部高度的操作

    效果图如下所示 .html 今日热门 今日热销 .js mounted(){ window.addEventListener('scroll',this.handleScrollx,true) }, ...

最新文章

  1. [云炬python3玩转机器学习] 5-6最好的衡量线性回归法的指标: R Squared
  2. Java黑皮书课后题第2章:2.1(将摄氏温度转换为华氏温度)编写程序,从控制台读入double型的摄氏温度值,将其转为华氏温度,显示结果
  3. BZOJ1558 等差数列
  4. hexo的yelee主题让文章呈现圆角效果
  5. [蓝桥杯][算法提高VIP]五次方数-枚举
  6. hdu java_HDU-java实现1176
  7. 今晚8点不见不散!余承东Vlog如此夸赞华为Mate30系列新机
  8. 升级AndroidStudio3.4问题汇总
  9. 支持XML和JSON数据的图表控件FusionCharts XT
  10. 随想录(我们从uboot学什么)
  11. 基本飞行模式中英文对照
  12. yum和apt-get 软件包管理器的用法及区别
  13. 【重大改革】吴恩达:孩子会识字后立马教她Python!
  14. php openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解
  15. RTSP/GB28181/SDK/EHOME协议视频智能分析共享平台EasyCVR安防视频云服务新增智能人脸识别功能
  16. windows驱动备份还原-(驱动软件无法更新)
  17. getBytes()详解
  18. 程序员5大热门发展行业,就业迷茫的同学注意啦!
  19. 如何在MSDN上获取Win7镜像
  20. 计算机网络协议(三)——UDP、TCP、Socket

热门文章

  1. C++实现IE缓存迭代器
  2. 扩展卡尔曼滤波soc估算 基于EKF算法的锂电池SOC 卡尔曼滤波估计电池soc ,simulink模型
  3. Android 集成百度地图服务和驾车导航jar包冲突、驾车导航引入armeabi-v7a平台
  4. It is a distutils installed project and thus we cannot accurately determine which files belong to
  5. MLX90614红外温度模块驱动
  6. 网站建设需要怎么做?个人网站建设教程
  7. 入行嵌入式开发若干年悟出的道理
  8. 配置 PO SLD步骤
  9. java毕业设计演唱会门票订售及管理系统Mybatis+系统+数据库+调试部署
  10. 5位数的数字黑洞是多少_揭秘数字黑洞6174