xccxvb 发表于 2020-7-17 12:09

【python】博主监测器开源,可同时监测多个博主

本帖最后由 xccxvb 于 2020-7-18 09:45 编辑

# 微博检测脚本
## 前言
之前做了一款基于tkinter的图形界面微博监测器,有人留言说想要监测多个博主,最近我也有这个需求,因此做了一个可以同时监测多个博主的脚本,用起来很简单,只需要修改配置文件即可,其它地方都不用改,运行命令行输入python main.py即可运行,也可以修改一下在云函数上运行。但此贴目的主要是发源码进行技术交流,所以用法我就不多讲解用法了。
这是之前那个贴子:https://www.52pojie.cn/thread-1204652-1-1.html

---
## 效果展示
!(https://s1.ax1x.com/2020/07/17/UsyLon.png)
!(https://s1.ax1x.com/2020/07/17/Usyqds.png)
!(https://s1.ax1x.com/2020/07/17/UsybZj.png)
## 配置文件
可以检测多个多个博主,只需改变配置文件config.ini即可
配置文件例子如下:
```angular2

# 检测目标uid,列表格式
uid =
# 发件箱
username = t******p@163.com
# 授权码
password = TQV********UCK
# 收件箱
rsvmail = 96******@qq.com
# 对方是否有置顶微博True or False
topweibo = True
# 检测时间间隔(单位/秒)
timespan = 300


# 下方配置不用设置,程序根据上方的uid自动生成,但请不要删除这一行

item_2532310695 = 1076032532310695_-_4526975157117527
item_6304244882 = 1076036304244982_-_4525153692654528
```
## 主文件
主文件是程序入口,理论上把if __name__ == '__main__':改为def main():就可以在云函数上配置了,但是实际操作时出现OS错误,咨询坛友后知道云函数不支持文件读写,所以需要用数据库来代替config,ini。这里有个包叫mod_config,这个是我自己写的包,为了方便对配置文件进行操作。
```
import requests
import json
import smtplib #smtp服务器
import time
import mod_config
from email.mime.text import MIMEText #邮件文本
from threading import Thread

def thread_it(uid, sender, pwd, user, choice, time_stop):
    t = Thread(target=start, args=)
    t.setDaemon(True) #守护!
    t.start()
    return t
def Get_json(uid): #监测用户的id
    url = 'https://m.weibo.cn/api/container/getIndex?uid={}&containerid=107603{}'.format(uid, uid)
    rsp = requests.get(url)
    content = json.loads(rsp.content)
    one = content['data']['cards']
    return content
def Compare(choice, content, uid): #是否选中置顶, json数据
    if not choice: #如果没有置顶
      itemid = content['data']['cards']['itemid']
      config = mod_config.read_config_item()
      oldid = config['item_'+str(uid)]
      print("旧微博id:", oldid, '新微博id:', itemid)
      if itemid == oldid:
            print("微博id:", oldid, '暂未更新')
            return None
      else:
            print("uid:"+str(uid)+"已更新", "旧微博id:", oldid, '新微博id:', itemid)
            mod_config.set_config_item("item_"+str(uid), itemid)
            return 1
    else:
      itemid = content['data']['cards']['itemid']
      config = mod_config.read_config_item()
      oldid = config['item_'+str(uid)]
      if itemid == oldid:
            print("微博id:", oldid, '暂未更新')
            return None
      else:
            print("uid:"+str(uid)+"已更新", "旧微博id:", oldid, '新微博id:', itemid)
            mod_config.set_config_item("item_"+str(uid), itemid)
            return 1
def Sendmail(recver, sender, password, text): #接收方,发送方,密码,邮件内容
    print('正在发送邮件')
    subject = ("您关注的博主微博已更新,快来看看吧!")# 邮件标题
    content = text
    message = MIMEText(content, "html", "utf-8")
    # content 发送内容   "plain"文本格式   utf-8 编码格式
    message['Subject'] = subject# 邮件标题
    message['To'] = recver# 收件人
    message['From'] = '博主动态小助手'# 发件人
    smtp = smtplib.SMTP_SSL("smtp.163.com", 994)# 实例化smtp服务器
    smtp.login(sender, password)# 发件人登录
    smtp.sendmail(sender, , message.as_string())# as_string 对 message 的消息进行了封装
def start(uid, sender, pwd, user, choice, time_stop):
    while True:
      content = Get_json(uid)
      if Compare(choice, content, uid):
            Sendmail(user, sender, pwd, '您关注的博主已更新微博,快去看看吧!https://m.weibo.cn/u/{}'.format(uid))
            print(time.ctime())
            time.sleep(int(time_stop))
      else:
            print(time.ctime())
            time.sleep(int(time_stop))

if __name__ == '__main__':
    uid_list, sender, pwd, user, choice, time_stop = mod_config.read_config_default()
    mod_config.init_config(uid_list)
    t = []
    for uid in uid_list:
      t.append(thread_it(uid, sender, pwd, user, choice, time_stop))
    for i in t:
      i.join()


```
## mod_config包
```
import configparser
# uid, sender, pwd, user, choice, time_stop
def read_config_default():
    print("正在读取配置文件")
    config = configparser.ConfigParser()
    config.read("config.ini", encoding='utf-8')
    uid = config['default']['uid']
    uid_list = eval(uid)
    sender = config['default']['username']
    pwd = config['default']['password']
    user = config['default']['rsvmail']
    choice = config['default']['topweibo']
    if choice == "True":
      choice = True
    elif choice == "False":
      choice = False
    else:
      raise Exception("配置文件topweibo参数出错")
    time_stop = int(config['default']['timespan'])
    print("配置文件读取完毕\n", uid_list, sender, pwd, user, choice, time_stop)
    return uid_list, sender, pwd, user, choice, time_stop
def read_config_item():
    config = configparser.ConfigParser()
    config.read("config.ini", encoding='utf-8')
    return config['weibo']
def set_config_item(item_uid, item_id):
    config = configparser.ConfigParser()
    config.read("config.ini", encoding='utf-8')
    config.set('weibo', item_uid, item_id)
    with open('config.ini', 'w') as f:
      config.write(f)
def init_config(uid_list):
    print('初始化项目配置')
    config = configparser.ConfigParser()
    config.read("config.ini", encoding='utf-8')
    for uid in uid_list:
      try:
            print('已存在:item_{}:'.format(uid)+config.get('weibo', "item_"+str(uid)))
      except configparser.NoOptionError:
            set_config_item("item_"+str(uid), '')
            print('item_{}不存在, 已自动配置'.format(uid) + config.get('weibo', "item_" + str(uid)))

```
## 结语
1. 此代码仅作技术交流,禁止商用
2. 欢迎大家提出自己的意见和问题,我们一起交流学习
3. 如果你觉得有用不要忘了免费评分哦

xccxvb 发表于 2020-7-17 15:17

huang9126 发表于 2020-7-17 15:02
有挂在github上吗?学习一下思路
需要登录的那个源码,能否也发一份给我,谢谢~
@xccxvb

不是,我是说加转发的话就需要登陆,我只能给贴子上的不登陆源码,微博登录的太麻烦了,我技术有限,并没有登录的源码

huang9126 发表于 2020-7-17 15:22

xccxvb 发表于 2020-7-17 15:17
不是,我是说加转发的话就需要登陆,我只能给贴子上的不登陆源码,微博登录的太麻烦了,我技术有限,并没 ...

了解了,不过还是非常感谢~

xingfu190 发表于 2020-7-17 12:20

可不可以在加一个检测到以后,自动转发呀

xccxvb 发表于 2020-7-17 12:31

xingfu190 发表于 2020-7-17 12:20
可不可以在加一个检测到以后,自动转发呀

那个需要登录,源码给你了,你可以自己修改哦

csange 发表于 2020-7-17 13:27

xccxvb 发表于 2020-7-17 12:31
那个需要登录,源码给你了,你可以自己修改哦

自动 转发的源码 可以发一份给我吗

gdp123gd 发表于 2020-7-17 14:03

有源码,必须mark下

dokuro 发表于 2020-7-17 14:06

支持原创

huang9126 发表于 2020-7-17 15:02

有挂在github上吗?学习一下思路
需要登录的那个源码,能否也发一份给我,谢谢~
@xccxvb

xingfu190 发表于 2020-7-18 08:32

zhaochong 发表于 2020-7-17 19:02
我有自动转发的

可以分享一份么?谢老哥
页: [1] 2
查看完整版本: 【python】博主监测器开源,可同时监测多个博主