这次文章为什么这么慢?是因为上周铲屎官独自撇下皮克啪,飞去日本给女朋友过18岁生日,浪了几天,啊哈哈哈哈。
这几天明显,北京的会开完了,空气质量,呵呵,呵呵呵呵。
那么这期我们来聊一聊外快的事儿。有kindle的同学,肯定了解,如果想看kindle的电子书,一般来说有这么几个渠道:
- 去kindle官网买,支持正版,但是书籍很贵,偶尔有打折的时候,打折也不便宜。土豪可以选择这条路。
- 去网上自己下载下来电子书,然后倒入到自己的kindle。这种方式一般对于不爱用电脑的同学来说,挺技术的,所以爱动手的同学可以选择这个。
- 最后一种就是去某宝或者去找一些公众号,他们那里提供书籍的下载,有偿的无偿的都有,而且,是推送的方式。这条路径几乎对所有人适用,而且很方便。
当时买了Kindle,我也是通过第三种方式来找书的,记得当时找了一个公众号,搜了些书,推送到Kindle上,就觉得炒鸡方便,但是后来那个公众号暂停服务了,之后又换了几个公众号,都不是很稳定,但是他们都有一个共同的特点,就是需要自己手动绑定一下邮箱。个人感觉,这个步骤似乎对没有电子智商的人来说,非常不友好,于是有的公众号就开通了专属客服,教你怎么绑定。整体而言,大家的流程都差不多,但是由于自己是个码农,出于职业上的好奇心,很想知道他们这些人是怎么搞的。所以就在网上谷歌,发现,推送最多的文章就是用KindleEar来做,但是这个东西是和google app engine契合在一起的,对于国内的童鞋,很是不友好。记得我在搜索的过程中,还发现有那种大神,每天爬取知乎热文,公众号文章之类的热点行文,然后自己整合一下,每天固定5点推送到kindle上,下了班在地铁上自己阅读。这其实是个很牛叉的做法,利用碎片化的时间来摄取知识,很强。可惜这个文章没说怎么做的。由此两点,铲屎官决定,靠天靠地不如靠自己,自己潜心修炼,势要打通此脉。果然,通过自己对Python的不断深入学习,慢慢的打通了所有节点,可以很轻松的完成这个任务了,啊哈哈哈哈。
那么今天,铲屎官就来和大家捯饬捯饬这上面说的第三种方法,给大家提供一下思路,和具体实现方法。做的好了,可以有偿帮助别人找书啊,比如一块钱十本书,不求多赚,只求平衡个电费而已,毕竟,你只是搬运工。
废话不多说,下面我们就来说说细节。
整体思路
拿到一个问题,我们首先就得来分析一下,这个问题由那几部分组成,这几个部分怎样做比较好。
Kindle推送服务器,大致可以分为两部分:找书和推送。
找书的过程我这里先不过多说,关键的技术点可以参考这几篇文章:
【Python实战】用代码来访问1024网站,送福利
【Python实战】用代码在1024论坛实现自动回贴
接下来我们来详细的说一下服务器推送的问题。推送的流程应该大致是这样的:
- 首先通过微信公众号来绑定用户的推送Kindle信息:Kindle的账户邮箱,Kindle已经认可的发件人邮箱,Kindle认可的发件人邮箱的STMP密码。
- 通过微信公众号发送搜搜书名,然后可以查找到相关书籍。
- 服务器通过之前绑定的账号,来实现Kindle的电子书推送。
- 大约10分钟的时间,电子书被推送到了Kindle上面,就可以愉快的看书喽。
大概就是这么几点,其实,看到这里,如果你是铲屎官的忠实读者,那么我说的这几点,其实在我之前的系列文章里面,关键的知识点都陆陆续续的详细的说过了,铲屎官在这里结合代码再帮大家捋一捋。
整套服务器代码我已经部署到了阿里云上,铲屎官手头有一些阿里云和腾讯云的优惠券,非常实惠,便宜力度很大,如果自己玩服务器的话,一年300多的服务器不到200就可以拿下来。可以通过下面的链接领取,数量有限,先到先得:
阿里云(总价值千元代金券):
https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=nrkmbo9q
腾讯云(总价值高达2775元代金券):
https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=b351b2fc50b15866ff9d19b58a5df0f5
首先,我们来先说一下这个通过微信公众号来绑定用户信息的事儿。
WeRobot
微信公众号开发,我首先推荐使用WeRobot框架,这个框架是对微信公众号官方开发文档里面提到的东西进行了一次封装,非常的好用,具体想了解更多的同学且有一定编程开发基础的同学,可以去看WeRobot的官方文档:
我们在这里需要用户绑定账号的场景,就是用到了WeRobot里面的Session。官方文档在下面:
WeRobot的Session其实就是讲每一个账号的信息保存到了一个数据库中,默认会在服务器本地文件夹下面创建一个werobot_session.sqlite3
文件,里面通过键值对
的形式来存储数据。下面的代码是在Kindle项目中运用到的session示例:
1from werobot import WeRoBot2from werobot.contrib.tornado import make_handler3import re45robot = WeRoBot(token="你的token")67urls = [8 (r'reply', make_handler(robot))9]
10debug_list = []
11exception_list = []
12info_message = []
13
14
15@robot.filter('kindle')
16def replyKindle(message, session):
17 count = session.get("kindle_count", 0)
18 email = session.get("kindle_auth_email", "")
19 if email is "":
20 session["kindle_count"] = count + 1
21 return "输入Kindle邮箱:"
22 else:
23 return "请输入要找的书名:"
24
25@robot.filter("重新绑定")
26def printSeesino(message, session):
27 session['kindle_count'] = 1
28 session['kindle_email'] = ""
29 session['kindle_auth_email'] = ""
30 session['kindle_auth_pwd'] = ""
31 return "解绑成功!\n请重新输入Kindle邮箱:"
32
33
34@robot.filter("session")
35def printSeesino(message, session):
36 return "session: " + str(session)
37
38@robot.filter(re.compile('找书:'))
39def replayHuitie(message, session):
40 return findBook(message, session)
41
42
43def findBook(message, session):
44 if session['kindle_count'] != 4:
45 return "请绑定Kindle账号,再来找书。"
46 book_name = message.content[3:]
47 if book_name is "":
48 return "老铁你输入的书名有误,请重新输入。"
49 else:
50 ### 找书的过程
51 # find_result = find_book()
52 find_result = True
53 if find_result is True:
54 ### 发送书籍的函数方法
55 # send_result = send_book()
56 send_result = emailSender().sendEmailWithAttr(session['kindle_email'], session['kindle_auth_email'],
57 session['kindle_auth_pwd'])
58 if send_result is True:
59 return "老铁你找书的内容:《" + book_name + "》\n后台已经成功给您发送,请您10分钟之内注意查收。感谢使用。"
60 else:
61 return "抱歉,老铁要的书发送失败,请重新试试。"
62 else:
63 return "抱歉,老铁要的书未能找到,请试试其他的书籍?"
64
65
66@robot.handler
67def restReply(message, session):
68 count = session.get("kindle_count", 0)
69 print(message.content + " count: " + str(count))
70 if count == 1:
71 session["kindle_count"] = count + 1
72 session["kindle_email"] = message.content
73 return "请输入Kindle认证邮箱:"
74 if count == 2:
75 session["kindle_count"] = count + 1
76 session["kindle_auth_email"] = message.content
77 return "请输入认证邮箱的密码:"
78 if count == 3:
79 session["kindle_count"] = count + 1
80 session["kindle_auth_pwd"] = message.content
81 return "绑定成功!\n你的Kindle邮箱地址:" + session['kindle_email'] \
82 + "\nKindle认证邮箱地址:" + session['kindle_auth_email'] + "\n认证邮箱密码:" \
83 + session['kindle_auth_pwd'] + "\n如果需要重新绑定,回复『重新绑定』即可。\n现在你可以找书啦,回复『找书: + 书名』即可,例如『找书:金鳞岂是池中物』"
84 if count == 4:
85 if "找书:" in message.content:
86 findBook(message, session)
87 else:
88 reply = """『皮克啪的铲屎官』这么牛逼的公众号,还不关注一波啊?"""
89 return reply
复制代码
可以看到,我这里是通过一个count变量来控制文本信息的处理的。每一个用户,当输入特定的关键字kinle
,就会进入指定的处理逻辑里面。然后通过count的变化,来控制不同的处理逻辑,同时,将用户输入的相关文本信息,再保存到session字典中。WeRobot会自动将信息更新到数据库中。
这里说几点可以发挥的地方:
- 可以检测用户输入的信息是否合法,比如需要输入邮箱的时候,输入的文本结构是否是合法的邮箱。
- 可以在自己Debug的时候,添加一些特殊的文字表示,用来打印自己需要的信息,比如添加
session
,用来打印自己的session信息,就如下:
那么到这里,我们的第一步就完成了,最后大致效果如下:
OK,这里我们就把微信公众号这块的代码逻辑捋清楚了。那么接下来我们得看,发送书籍的代码应该怎么搞。
发送.mobi文件
这里需要通过Python来发送邮件。首先,我们得先了解一下如何通过发邮件的形式来把mobi
文件发送到kindle上。这里,kindle的官方文档有很详细的说明:
这里需要注意的就是,如果想要成功发送mobi文件到Kindle上,有两点要求:
- 发送文件的邮箱必须是在Kindle的认可电子邮件列表里的邮箱。
- 邮件的主题必须是“Convert”
所以,我们这里只需要,把找到的书籍,把书籍文件作为邮件的附件,邮件的标题是“Convert”,通过Kindle认证的邮箱,发邮件到Kindle账户邮箱。这样就完成了书籍的推送。是不是超级简单?
所以,这里我们先略过找书的过程,相关技术点请参考文章1。我们就把现成的书籍通过邮件的形式发送到Kindle上。细心的同学看到我上面的微信公众号代码里面有一行send_result = emailSender().sendEmailWithAttr(session['kindle_email'], session['kindle_auth_email'],session['kindle_auth_pwd'])
没错,这个就是发送邮件的方法调用。那么这个emailSender()
的代码就是长这个样子:
1class emailSender(object):2 def __init__(self):3 self.smtp_host = "smtp.126.com" # 发送邮件的smtp服务器(从QQ邮箱中取得)4 self.smtp_port = 465 # smtp服务器SSL端口号,默认是46556 def sendEmailWithAttr(self, kindleEmail, kindleAuthEmail, kindleAuthPwd):7 '''8 发送邮件9 '''
10 logging("sendEmailWithAttr:::\nkindleEmail: " + kindleEmail + "\nkindleAuthEmail: " + kindleAuthEmail + "\nkindleAuthPwd: " + kindleAuthPwd)
11 message = MIMEMultipart() # 邮件内容,格式,编码
12 message['From'] = kindleAuthEmail # 发件人
13 message['To'] = kindleEmail # 收件人列表
14 message['Subject'] = "Convert" # 邮件标题
15 filename = './txt/哲学的慰藉-阿兰德波顿.mobi' # 本地书籍
16 with open(filename, 'rb') as f:
17 attachfile = MIMEApplication(f.read())
18 filename = "哲学的慰藉-阿兰德波顿.mobi"
19 attachfile.add_header('Content-Disposition', 'attachment', filename=filename)
20 encoders.encode_base64(attachfile)
21 message.attach(attachfile)
22 try:
23 smtpSSLClient = smtplib.SMTP_SSL(self.smtp_host, self.smtp_port) # 实例化一个SMTP_SSL对象
24 loginRes = smtpSSLClient.login(kindleAuthEmail, kindleAuthPwd) # 登录smtp服务器
25 logging(f"登录结果:loginRes = {loginRes}") # loginRes = (235, b'Authentication successful')
26 if loginRes and loginRes[0] == 235:
27 logging(f"登录成功,code = {loginRes[0]}")
28 smtpSSLClient.sendmail(kindleAuthEmail, kindleEmail, message.as_string())
29 logging(f"mail has been send successfully. message:{message.as_string()}")
30 return True
31 else:
32 logging(f"登陆失败,code = {loginRes[0]}")
33 return False
34 except Exception as e:
35 logging(f"发送失败,Exception: e={e}")
36 return False
复制代码
可以看到,上面的代码就是将Subject填写Convert,然后将mobi书籍当附件的形式发送出来,就可以了。这个发送邮件的过程,和“1024种子吞噬器V2.0”版本很像,参考文章:
【Python实战】带你玩转Scrapy的高阶骚操作,带邮件功能的“1024种子吞噬器2.0”,更高更快更强!千元福利等你取
下面铲屎官就给大家演示一下整个是流程:
首先是公众号绑定:
接着就是绑定成功,开始而且显示的发书也成功:
那么我们来看一下自己的Kindle:
欧耶,一切搞定。这套流程完美跑通。其实,这只是一半的过程,剩下还有一半,我们下回再说,但是你也可以自己先研究研究。这些小玩意儿其实都是可以带来小额收益的,不吹牛逼。
简单总结
这里就简单的总结一下,说几点比较关键的地方:
- 发送邮箱的绑定过程,这里只是绑定了126的邮箱,其实不同的邮箱他的STMP端口是不一样的,而且STMP服务器地址也是不一样的,这里需要做一下判断。
- 这里只是发送书籍的过程,其实应该在书籍搜索,返回书籍的搜索结果,然后让用户选择下载哪本书。下载书籍我目前想到的方式就是先下载到服务器上,然后才能通过附件的格式发送出去,最后需要执行以下删除操作。
- 其实这个功能可以玩的花活很多,不光发送书籍这么简单,也可以指定订阅比如1024Daily页面啊,每天都发送到Kindle上,或者喜欢哪个系列的技术讨论区的帖子,可以每天发送到自己的Kindle上。可以玩的方向有很多,等待大家自己去挖掘。
感谢你能够容忍铲屎官唠叨这么多碎碎的知识点,那么我也不会亏待你,这个服务器我是用tornado编写的,整套代码我已上传,获取源码方式只需要关注『
下一步的计划,我今天觉得Daily项目有可以改进的地方,所以,下一步可能会加入一个集合的功能,啊哈哈哈哈,这样就越来越方便了。啊哈哈哈哈
推荐阅读
一,一篇文章就够打通python网络请求,scrapy爬虫,服务器,代理,各种骚操作,真的一篇就够
二,手把手用阿里云服务器搭建袜子工具,从此不再求人,内有福利
三,【Python实战】通过“酸酸”的骚操作,让Scrapy爬虫变得没有国界,真正的硬核为所欲为,想爬啥就爬啥
粉一波自己的小程序
这么硬核的公众号,还不关注一波啊?