微信机器人结合爬虫技术自动推送舆论热点给好友(附加功能:退订处理加回复,新消息6小时以上自动回复)

舆论热点推送.jpg

功能描述:

好友请求自动处理,消息智能回复(待优化),舆情热点推送,接受用户的退订请求.
最核心的功能就是每日舆论热点飙升排行榜的推送,数据来源新浪,默认排行榜前五,默认每日一次

源代码如下:

自己配置redis(主要为退订功能服务), 直接运行跑就完了!
如果您要享受此服务,请加我的好友 occupysmall

import itchat, time
from itchat.content import *
import requests
from lxml import etree
from redis import StrictRedis
from threading import Thread


"""
实现功能:
    1. 退订处理加回复
    2. 新消息6小时以上自动回复(首次收到立即回复)
    3. 每隔四小时推送一次当前舆论热点排行版(前五名)
    4. 支持退订,退订好友,加入黑名单以后不会再发(默认全员发送)
    
"""


redis_cli = StrictRedis(host='192.168.1.191')


class SendNews:
    headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
    }
    # itchat.auto_login(True)
    target_users = ['change', '华灯初上']

    def getUsername(self):
        users = itchat.get_friends(update=True)
        for user in users:
            if user['NickName'] in self.target_users:
                if not redis_cli.sismember('blacklist', user['NickName']):
                    print(user)
                    yield user['UserName']

    def getUsernameAll(self):
        """
        给所有人(不包含黑名单)群发
        :return:
        """
        users = itchat.get_friends(update=True)
        for user in users:
            if not redis_cli.sismember('blacklist', user['NickName']):
                yield user['UserName']

    def sendnews(self):
        """
        爬取新闻推送到微信
        :return:
        """

        url = "https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=AI"
        for i in ['AI', '人工智能']:
            newurl = url.format(i)

            html = requests.get(newurl, headers=self.headers).text
            tree = etree.HTML(html)
            patterns = tree.xpath('//h3/a')
            allnews = ''
            for pattern in patterns:
                detailurl = pattern.xpath('./@href')[0]
                title = pattern.xpath('string(.)').strip()
                allnews += ("{}  {}\n\n".format(title, detailurl))
            for touser in self.getUsername():
                itchat.send(allnews, toUserName=touser)

    def sendweiredian(self):
        formdata = {
            "timeType": 1,
            "sort": 5,
            "labels": "",
            "province": "",
            "areaType": 1,
            "page": 1,
            "pageSize": 20,
            "city": "",
            "isLogin": False
        }

        sinaweiredianurl = 'http://www.wrd.cn/view/home/hotEvent/selectChooseListData.action'
        result = requests.post(sinaweiredianurl, data=formdata, headers=self.headers).json()['list']
        # print(result)
        num = 0
        weinews = ""
        for i in result:
            if num < 5:
                num += 1
                content = "\t".join([str(num), i['incidentTitle'], i['keyword']]) + '\n\n'
                weinews += content
        print(weinews)
        # itchat.send(weinews, toUserName='@6e6512bff85fb8b2c1f4bd14ea48d8ec7a0a74a48c7f74e6856b498a6f329584')
        title = "\t\t\t今日舆情飙升榜\n\n\n"
        weinews = title + weinews
        for touser in self.getUsername():
            itchat.send(weinews, toUserName=touser)

    def main(self):
        while True:
            now = time.strftime("%H")
            if now == '07':
                self.sendnews()
            else:
                self.sendweiredian()
            time.sleep(60 * 60 * 4)





@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
    # print(msg.user)
    print('您有来自{}的新消息'.format(msg.user['NickName']))
    # print(msg.text)
    if '退订' in msg.text:
        redis_cli.sadd('blacklist',msg.user['NickName'])
        msg.user.send('OK')
    else:
        # 6小时以上的消息自动回复,以内不予响应
        exist = redis_cli.get(msg.user['NickName'])
        if not exist:
            msg.user.send('您好!在忙,待会回您哦 > _ <')
            redis_cli.set(msg.user['NickName'], int(time.time()))
            print('保存成功{}'.format(msg.user['NickName']))
        else:
            oldtime = int(exist.decode())
            TimeDifference = time.time() - oldtime
            if TimeDifference > 60 * 60 * 6:
                msg.user.send('您好!在忙,待会回您哦 > _ <')
                # redis_cli.set(msg.user['NickName'], time.time())
                redis_cli.set(msg.user['NickName'], int(time.time()))
                print('保存成功{}'.format(msg.user['NickName']))
            else:
                print('未满足6小时,6小时以上再回复')


@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
    """
    下载文件
    :param msg:
    :return:
    """
    msg.download(msg.fileName)
    typeSymbol = {
        PICTURE: 'img',
        VIDEO: 'vid', }.get(msg.type, 'fil')
    return '@%s@%s' % (typeSymbol, msg.fileName)

@itchat.msg_register(FRIENDS)
def add_friend(msg):
    """
    接受好友请求
    :param msg:
    :return:
    """
    msg.user.verify()
    msg.user.send('Nice to meet you!')

@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
    """
    回复群@
    :param msg:
    :return:
    """
    if msg.isAt:
        msg.user.send(u'@%s\u2005I received: %s' % (
            msg.actualNickName, msg.text))

itchat.auto_login(True)

def reply_messages():
    itchat.run(True)

def send_messages():
    sendm = SendNews()
    sendm.main()




if __name__ == '__main__':
    t1 = Thread(target=reply_messages)
    t2 = Thread(target=send_messages)
    for t in [t1,t2]:
        t.start()
    # reply_messages()
    # itchat.run(True)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352