Tagged: 爬虫

Python实战之520特别版:用微信每天和她说晚安

今天是传说中的520,不知你是否已经准备好要表白的话语。为了助你撩妹成功,云厉今天也学着某些人土土的教大家用Python每天给妹纸说晚安。
没错,每天!
用对了Python,每天都过520

这次真的是面向对象编程

大致思路是这样:

  1. 调接口获取每日心灵鸡汤或撩妹话术
  2. 基于wxpy模块,授权微信登录,搜索聊天对象,发送XX消息
  3. Timer每日发送
  4. 后台挂起执行脚本

安装wxpyrequests

pip3 install wxpy
pip3 install requests

其他如果没安装,也一并安装

下面发送信息脚本send_wx.py,不到40行的代码,注释不多,相信你懂!

# -*- coding: utf-8 -*-

from threading import Timer
from wxpy import *
import requests

bot = Bot(console_qr=2, cache_path='botoo.pkl') 

# 她的昵称和你的昵称。是微信昵称,不是备注哦
ta_name = '若';
my_name = '云厉';

# 从金山词霸获取每日鸡汤,英文和翻译,如果你有更好的鸡汤数据源,也可以更换
def get_message():
    url = "http://open.iciba.com/dsapi/"
    r = requests.get(url)
    contents = r.json()['content']
    translation= r.json()['translation']
    return contents, translation

# 给TA发送晚安信息
def send_message(): 
    try:
        message = get_message()
        # 搜索聊天对象,并ensure_one保证她的昵称在你的微信好友列表里只有一个
        my_love = ensure_one(bot.search(ta_name, sex=FEMALE))
        # 发送鸡汤
        my_love.send(message[0])
        my_love.send(message[1][5:])
        my_love.send(u'亲爱的,晚安!爱你~')
        # 每86400秒(1天),发送1次
        t = Timer(86400, send_message)
        t.start()
    except:
        my_self = ensure_one(bot.search(my_name, sex=MALE))
        my_self.send(u'今天撩妹消息发送失败了')

if __name__ == '__main__':
    send_message()
# 丢后台跑起来!
nohup python3 send_wx.py > send_wx.log 2>&1 &

首次运行,脚本会生成二维码,需要授权登录。这也是为什么在脚本内用Timer定时发送而不用Linux的cron,就是为了不要每次都授权登录,太麻烦!

测试一把,效果如下:

wxpy还能干啥?

  • 控制路由器、智能家居等具有开放接口的玩意儿
  • 运行脚本时自动把日志发送到你的微信
  • 加群主为好友,自动拉进群中
  • 跨号或跨群转发消息
  • 自动陪人聊天
  • 逗人玩
  • ...

总而言之,可用来实现各种微信个人号的自动化操作

如果你有兴趣,欢迎关注微信公众号:程序员到架构师,不定期更新各种各样的Python技术

不用OAuth授权,10行代码获取用户微博昵称

这种需求看似奇葩,其实很常见,比如你的应用或网站接入了微博登录,一般会在数据库维护用户绑定的微博唯一ID,但用户的可变信息一般不会存。
然后在一些专题页,用到了用户的微博头像和昵称,这时候如果用OAuth协议,需要先获取授权码,再获取token,再调用户信息接口 ...

如果你觉得太麻烦,那就来试试笔者的方法。笔者的微博:http://weibo.com/1864997710 ,直接cURL:

curl 'http://weibo.com/1864997710' -v

* About to connect() to weibo.com port 80 (#0)
* Trying 123.125.104.197... connected
> GET /1864997710 HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: weibo.com
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily < Server: WeiBo < Date: Thu, 18 Sep 2014 02:02:22 GMT < Content-Type: text/html; charset=utf-8 < Transfer-Encoding: chunked < Connection: close < Expires: Sat, 26 Jul 1997 05:00:00 GMT < P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" < Cache-Control: no-cache, no-store < Pragma: no-cache < Location: http://passport.weibo.com/visitor/visitor?a=enter&url=http%3A%2F%2Fweibo.com%2F1864997710&_rand=1411005742.125 < DPOOL_HEADER: alice97 < Set-Cookie: TC-Page-G0=4e714161a27175839f5a8e7411c8b98c;Path=/ < LB_HEADER: alice27 < * Closing connection #0

看来直接抓取用户主页的形式不靠谱,因为未登录,微博给你重定向了。

庆幸的是,微博还有一个页面,是不需要登录,而且恰好有微博昵称。
就是访问某人的微博时产生的邀请注册页,页面中会有TA的微博昵称,于是就呵呵了

下面这个函数,可以帮你实现,无需授权无需登录,根据微博ID获取微博昵称

这样做,有什么好处?
1.少写很多OAuth相关代码
2.也降低了多次http的网络消耗
3.实时性(也可以根据需要缓存起来)

微信公众号:程序员到架构师

最新文章

Return Top