使用Python itchat接口对自动对微信群朋友定时问候(发送天气预报、黄历、每日一句)_cskywit的博客-程序员宅基地

技术标签: Python  

      itchat是一个支持微信控制的接口,可以对发送和接收的微信消息进行定制,网上有很多现成的实例,该API的使用可以参考http://itchat.readthedocs.io/zh/latest/,上面写得很详细,并且有实例,本文在此基础上参考了网络上的部分代码,完成每天上午自动对几个群的朋友进行问候,发送问候语、黄历和每日一句。其中黄历使用了极数据的黄历接口,见https://www.jisuapi.com/,但是该接口有使用100次的限制,也可以使用聚合数据接口,这个没有次数限制。每日一句使用了爱词霸的每日一句接口,网上有很多例子可供参考。天气预报使用了中国天气网数据,将城市代码换成自己所在城市的即可。代码比较简单,使用Pyhton3.6,功能已实现,贴出来供参考,下一步工作是将杂乱的功能函数封装成类,使代码更加紧凑。

     安装itchat方法:pip install itchat

    代码如下:

# coding=utf-8
from datetime import datetime
import itchat
from apscheduler.schedulers.background import BlockingScheduler
import  json
import  urllib.request
import requests
from urllib.parse import urlencode


cityList_bsgs = [
    {'code':'101290801','name':"楚雄"}
]
chatroom_list =['男朋友们','女朋友们']

def get_huangli():
    data = {}
    data["appkey"] = "换成自己的key"
    data["year"] = datetime.now().year
    data["month"] = datetime.now().month
    data["day"] = datetime.now().day
    url_values = urlencode(data)
    url = "http://api.jisuapi.com/huangli/date" + "?" + url_values
    r = requests.get(url)
    jsonarr = json.loads(r.text)
    if jsonarr["status"] != u"0":
        print(jsonarr["msg"])
        exit()
    result = jsonarr["result"]
    content1='天干地支:' + ','.join(result['suici'])
    content2='今日应当注意的生肖:' + result["chong"]
    content3='宜:' + ','.join(result['yi'])
    content4='忌:' + ','.join(result['ji'])
    return '今日黄历:'+content1+'\n'+content2+'\n'+content3+'\n'+content4

def get_iciba():
    url = 'http://open.iciba.com/dsapi/'
    r =requests.get(url)
    content = json.loads(r.text)
    return '每日一句:\n'+content['content'] +'\n'+content['note']

def getCityWeather_RealTime(cityID):
    url = "http://www.weather.com.cn/data/sk/" + str(cityID) + ".html"
    try:
        stdout = urllib.request.urlopen(url)
        weatherInfomation = stdout.read().decode('utf-8')

        jsonDatas = json.loads(weatherInfomation)

        city        = jsonDatas["weatherinfo"]["city"]
        temp        = jsonDatas["weatherinfo"]["temp"]
        fx          = jsonDatas["weatherinfo"]["WD"]        #风向
        fl          = jsonDatas["weatherinfo"]["WS"]        #风力
        sd          = jsonDatas["weatherinfo"]["SD"]        #相对湿度
        tm          = jsonDatas["weatherinfo"]["time"]

        content = city +" " + temp + "℃ " + fx + fl + " " + "相对湿度" + sd + " "  + "发布时间:" + tm
        twitter = {'image': "", 'message': content}

    except (SyntaxError) as err:
        print(">>>>>> SyntaxError: " + err.args)
    except:
        print(">>>>>> OtherError: ")
    else:
        return twitter
    finally:
        None

#返回dict类型: twitter = {'image': imgPath, 'message': content}
def getCityWeather_AllDay(cityID):
    url = "http://www.weather.com.cn/data/cityinfo/" + str(cityID) + ".html"
    try:
        stdout = urllib.request.urlopen(url)
        weatherInfomation = stdout.read().decode('utf-8')
        jsonDatas = json.loads(weatherInfomation)

        city        = jsonDatas["weatherinfo"]["city"]
        temp1       = jsonDatas["weatherinfo"]["temp1"]
        temp2       = jsonDatas["weatherinfo"]["temp2"]
        weather     = jsonDatas["weatherinfo"]["weather"]
        img1        = jsonDatas["weatherinfo"]["img1"]
        img2        = jsonDatas["weatherinfo"]["img2"]
        ptime        = jsonDatas["weatherinfo"]["ptime"]

        content = city + "," + weather + ",最高气温:" + temp2 + ",最低气温:"  + temp1
        twitter = {'image': "icon\d" + img1, 'message': content}

    except (SyntaxError) as err:
        print(">>>>>> SyntaxError: " + err.args)
    except:
        print(">>>>>> OtherError: ")
    else:
        return twitter
    finally:
        None

def get_context():
    for city in cityList_bsgs:
        title_small = "[楚雄实时天气预报]"
        twitter = getCityWeather_RealTime(city['code'])
        print(title_small + twitter['message'])
        twitter_realTime = title_small + twitter['message']

    for city in cityList_bsgs:
        title_small = "[楚雄全天天气预报]"
        twitter = getCityWeather_AllDay(city['code'])
        print(title_small + twitter["message"])
        twitter_wholeDay = title_small + twitter["message"]
    return "美好的一天从我的问候开始:各位亲人早上好!\n"+twitter_realTime+"\n"+twitter_wholeDay+'\n'+get_huangli()+'\n'+get_iciba()

def SentChatRoomsMsg(name, context):
    itchat.get_chatrooms(update=True)
    iRoom = itchat.search_chatrooms(name)
    for room in iRoom:
        if room['NickName'] == name:
            userName = room['UserName']
            break
    itchat.send_msg(context, userName)
    print("发送时间:" + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n")
    print("发送到:" + name + "\n")
    print("发送内容:" + context + "\n")
    print("*********************************************************************************")
    scheduler.print_jobs()

def loginCallback():
    print("***登录成功***")

def exitCallback():
    print("***已退出***")

itchat.auto_login(hotReload=True, enableCmdQR=True, loginCallback=loginCallback, exitCallback=exitCallback)
scheduler = BlockingScheduler()
#name = '老寸家'
#context =get_context()
for sent_chatroom in chatroom_list:
    scheduler.add_job(SentChatRoomsMsg, 'cron', day_of_week ='0-6',hour =7,minute =30,kwargs={"name": sent_chatroom, "context": get_context()})
    print("任务" + ":\n"+"待发送到:" + sent_chatroom + "\n"+"待发送内容:" + get_context() + "\n")
    print("******************************************************************************\n")

scheduler.start()

       以上是在Windows上的实现,由于想每天上午7点半在微信群自动问候:所以需要部署在服务器上,这里选择腾讯云Ubuntu服务器,在部署过程中遇到的问题是,服务器没有图形界面,itchat需要用二维码登录微信,在终端上打印出来的二维码不完整,没法登录,后来将登录部分代码调整如下,问题得到解决:

#若为Linux服务器如下,否则二维码显示不正常。如部分的linux系统,块字符的宽度为一个字符(正常应为两字符),故赋值为2
itchat.auto_login(hotReload=True, enableCmdQR=2, loginCallback=loginCallback, exitCallback=exitCallback)

后面遇到的问题是:执行python weixin.py &后程序执行,但关闭终端后程序自动退出,解决如下:

使用以下命令执行:nohup python -u weixin.py &

可以使用tail -f nohup.out查看程序执行情况,这样就可以关闭远程连接让程序自动执行了。

第二天早上七点半,两个微信群准时收到了使用我的微信账号自动发送的问候消息:

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cskywit/article/details/81506517

智能推荐

在更改热键后Sublime运行不了python文件_提示FileNotFoundError(2,'')_sublime file not found error 2-程序员宅基地

当你根据网络上其他大牛的指引完成修改热键(https://blog.csdn.net/mx472756841/article/details/50535517)比如设置了F1作为Python快速启动的快捷键,却发现按F1报错,那么我遇到的是来自两方面的:1.Python的路径没有设置正确,可根据教程做(https://blog.csdn.net/u014515340/article/deta..._sublime file not found error 2

关注研究生就业状态 (转)_硕士找工作论文状态-程序员宅基地

据复旦、交大、同济、华师大等几所高校公布的数据,今年硕士和博士研究生就业率均超过了95%,个别高校甚至达到了100%。在近乎100%的就业率背后,研究生的就业状态到底如何?企业、猎头等用人方又是如何看待研究生的?   当“唯学历”时代逐渐远去,研究生这群“皇帝的女儿”突然成了“行走在尴尬地带的群体”。媒体时有报道说,因为眼高手低和高不成低不就,用人单位普遍对研究生信心 不足。   不过_硕士找工作论文状态

C 语言程序设计实践 9.6 闲情逸致-程序员宅基地

AC代码:#include int main() { int n,i,num[1005]={1}; num[1]=1;num[2]=1; num[3]=2;num[4]=3; for (i=5;i<=1000;i++) num[i]=(num[i-1]+num[i-3]+num[i-5])%2014;

如何在java中写sql语句_java中sql怎么写-程序员宅基地

我们知道在java连接数据库之后,需要数据库的sql语句,但是在转化的过程中可能会出现各种各样的问题那么java的字符串到底是怎样转化为SQL语句的呢如图所示..._java中sql怎么写

命令行修复MBR分区-程序员宅基地

命令行修复MBR 1、shift+F10打开命令行2、输入:diskpart3、输入:list disk 查看磁盘信息4、选择你要操作的磁盘:select disk 05、输入:clean,清除分区6、输入:convert mbr 转换为MBR分区7、退出,重新分区OK注意:在做以上操作的时候先备份文件 ...

mysql如何批量导入excel_MySQL批量导入Excel数据-程序员宅基地

1、确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序;(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名称一致,方便需要导入多张表数据时一一对应))2、在Excel表中,正确填写需要导入的数据,一行数据对应着数据库表中的一行记录;(注:各个字段的格式要求需要和数据库中的限制一样,避免出现差错)3、收集好需要导入的数据后,点击保存。(注:..._mysql 的excet.batch

随便推点

Firefox火狐浏览器优化加速about:config配置_火狐about:config-程序员宅基地

如果你是个爱折腾的火狐迷,进阶about:config火狐浏览器高级配置命令就不得不学啦,用了chrome后会不会小小抱怨火狐上网速度慢了?不过相信你还是不会嫌弃火狐的。本文主要介绍一些修改about:config高级配置的参数来优化加速火狐,实用易学,解释详细,通俗易懂,童叟无欺!_火狐about:config

邮件群发怎么一次发给几百个人?哪个邮箱群发效果好呢_群发邮件怎么发很多人-程序员宅基地

邮件群发是日常业务拓展的重要方式,尤其是外贸、电商、展会等行业。性价比高、更精准、营销效果强都是邮件营销的特点,但很多企业往往因选不到合适的邮件群发平台而屡屡受阻,究竟哪个邮箱群发效果更好呢?1. 普通邮箱代表品牌有@tom.com、@163com、@soho.com等,此类邮箱通常为收取邮件使用,在群发的使用过程中,发信量是一大难点,且需要不断的更换IP及账号,优势是成本低,不足是耗费的时间及人力成本高,且整体效果有待提高2. 个人付费邮箱也就是我们常说的VIP邮箱,代表品牌有@163.net、@_群发邮件怎么发很多人

狂神说Java博客地址_狂神博客地址_Artistic Person的博客-程序员宅基地

https://blog.csdn.net/qq_33369905/?type=blog_狂神博客地址

mysql当前日期减去天数,有没有一种方法可以从MySQL中的日期中减去天数?-程序员宅基地

是的,您可以使用date_sub()从日期中减去天数。以下是语法-selectdate_sub(yourColumnName,IntervalyourAmountOfDaysday)fromyourTableName;让我们首先创建一个表-createtableDemoTable660(AdmissionDatedatetime);使用插入命令在表中插入一些记录-insertin..._mysql当前时间减6天

计算机组成原理5-主存储器—半导体存储芯片和随机存取存储器_片选线的作用-程序员宅基地

一、主存储器——半导体存储芯1、半导体存储芯片的基本机构读写控制线:将CPU的控制信号传给读写电路地址线:将CPU需要的地址传输到译码驱动中,然后由译码驱动进行翻译,然后进行寻址,是单向的地址线的数量决定了存储单元的数量,假如有8根地址线:0000 0000 总共有几种排列组合,即2的8次方。每一种组合都对应一个存储单元。数据线:将存储体中的数据读出,放入CPU;将CPU计算完毕的数据存入存储体。是双向的。数据线的数量决定了存储单元的大小,即一个存储单元能够存多少数据。比如八根数_片选线的作用