猫史档案馆


【作品秀】用python实现编程猫收到信息的提醒

用户:lsk666666lsk666666查看:8 回复:7 评论:8 创建时间:2020-06-16T11:00:49


最近发了不少文章,评论、点赞的人也越来越多,这样每天都要去关注编程猫的消息提醒,麻烦喵了。如果可以用python去获取编程猫的消息数据,并进行主动的提醒,就会方便多了!

说干就干,首先我们需要分析编程猫网页消息提醒的实现方式。

打开编程猫的网页,摁“F12”打开开发者工具,并切换到Network项,我们将要用它来抓这个编程猫网站对编程猫服务器的各个请求。

接下来切换到“XHR”下面,如图所示:

center_image

接下来刷新网页,可以看到Network记录下了许多的请求,稍等片刻,等待请求全部完成。
center_image

这里便是编程猫网页前端向后端发出的所有HTTP请求了。

不难发现,这个列表中的count请求便是主管消息数目的请求。点击它,列表的右侧就显示出来这个请求的详细信息:

center_image

图中画红线的地方就是这个“count”请求所请求的地址了。这是一个GET类型的请求,而且没有任何与用户信息相关的参数、头信息,可以推测,编程猫后台获得用户信息的方式是Cookie、Session Storage中的一个。

把这个请求地址复制到一个新的标签页,发现仍可以获得到消息的数目:

center_image

这进一步印证了刚才的猜测。

再打开开发者工具,切换到“Application”项,我们在这里可以看到这个请求更为详细的数据。

center_image

分别查看“Session Storage”和“Cookies”项:

center_imagecenter_image

发现这个接口是使用Cookies进行传值的。然后我们清除掉所有的Cookie数据,并刷新网页,发现已经无法正常获得到数据了

center_image

由此可知,刚刚这几条Cookie数据就是获取消息数量的关键。

我们把这些信息整理下来:

center_image

依据这些信息,我们就可以先编写一个简单的测试程序:

import requests
from requests.cookies import RequestsCookieJar

cookieJar = RequestsCookieJar()
cookieJar.set("","",domain=".codemao.cn") #在这里依据Application中的数据和我们整理的Cookie数据设置好你的每个Cookie数据。

resp = requests.get("https://api.codemao.cn/web/message-record/count",cookies = cookieJar)
print(resp.text)

center_image

(P.S. 这里截屏用的是我已经写好的代码,大家编写代码时参考这两个程序就可以了。)

可以看到他运行成功了:

center_image

然后对他进行一个简单的解析和封装,就可以编写最终的程序了

我的思路:

让他在我的树莓派上运行,如果有新的信息,就让树莓派上连接的一个LED亮。每10秒检测一次。

挂上我的代码:

import requests
from requests.cookies import RequestsCookieJar
import RPi.GPIO as GPIO
import time

cookieJar = RequestsCookieJar()
#Cookie信息,把xxx替换为你的Cookie信息.
cookieJar.set("__ca_uid_key__","xxx",domain=".codemao.cn")
cookieJar.set("_ga","xxx",domain=".codemao.cn")
cookieJar.set("acw_tc","xxx",domain="api.codemao.cn")
cookieJar.set("_gid","xxx",domain=".codemao.cn")
cookieJar.set("authorization","xxx",domain=".codemao.cn")
cookieJar.set("gr_user_id","xxx",domain="api.codemao.cn")
cookieJar.set("grwng_uid","xxx",domain="api.codemao.cn")
def hasMessage():
        resp = requests.get("https://api.codemao.cn/web/message-record/count",cookies = cookieJar)
        respJson = resp.json()
        commentCountJson = respJson[0]
        likeCountJson = respJson[1]
        systemCountJson = respJson[2]
        print("comment:",commentCountJson["count"])
        print("like:",likeCountJson["count"])
        print("system:",systemCountJson["count"])
        return not (commentCountJson["count"] == 0 and likeCountJson["count"] == 0 and systemCountJson["count"] == 0)

def main():
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(13,GPIO.OUT)
        try:
                while True:
                        if hasMessage():
                                GPIO.output(13,GPIO.LOW)
                        else:
                                GPIO.output(13,GPIO.HIGH)
                        time.sleep(10)
        except KeyboardInterrupt:
                GPIO.cleanup()

if __name__ == "__main__":
        main()

 

参考链接:

使用 RPi.GPIO 模块的输出(Output)功能:https://shumeipai.nxez.com/2016/09/28/rpi-gpio-module-outputs.html python requests 获取,设置cookie:https://blog.csdn.net/hpulfc/article/details/80084398

 

萌新写文,如果有错误,欢迎各位大佬在评论区提出!


回复

上一页1 页 / 共 1下一页
lsk666666lsk666666

如果各位看官觉得这篇文章不错,请在这层楼点赞!emotion_编程猫_谢谢老板

点赞6


评论


lsk666666lsk666666

补个工作照center_image

点赞1


评论


_someone__someone_

小型技术论文

点赞0


评论


_someone__someone_

膜拜大佬

点赞0


评论


lsk666666lsk666666

代码有问题,这里修改一下

import requests
from requests.cookies import RequestsCookieJar
import RPi.GPIO as GPIO
import time

cookieJar = RequestsCookieJar()
#Cookie信息,把xxx替换为你的Cookie信息.
cookieJar.set("__ca_uid_key__","xxx",domain=".codemao.cn")
cookieJar.set("_ga","xxx",domain=".codemao.cn")
cookieJar.set("acw_tc","xxx",domain="api.codemao.cn")
cookieJar.set("_gid","xxx",domain=".codemao.cn")
cookieJar.set("authorization","xxx",domain=".codemao.cn")
cookieJar.set("gr_user_id","xxx",domain="api.codemao.cn")
cookieJar.set("grwng_uid","xxx",domain="api.codemao.cn")
def hasMessage():
        resp = requests.get("https://api.codemao.cn/web/message-record/count",cookies = cookieJar)
        respJson = resp.json()
        commentCountJson = respJson[0]
        likeCountJson = respJson[1]
        systemCountJson = respJson[2]
        print("comment:",commentCountJson["count"])
        print("like:",likeCountJson["count"])
        print("system:",systemCountJson["count"])
        return (not commentCountJson["count"] == 0) or (not likeCountJson["count"] == 0) or (not systemCountJson["count"] == 0)

def main():
        GPIO.se喵ode(GPIO.BOARD)
        GPIO.setup(13,GPIO.OUT)
        try:
                while True:
                        if hasMessage():
                                GPIO.output(13,GPIO.LOW)
                        else:
                                GPIO.output(13,GPIO.HIGH)
                        time.sleep(10)
        except KeyboardInterrupt:
                GPIO.cleanup()

if __name__ == "__main__":
        main()

点赞0


评论


蒟蒻OIer1048576蒟蒻OIer1048576

set(去掉)mode?

点赞0


评论


物理还需悟理物理还需悟理

我觉得Python真的是厉害...

 

点赞0


评论