raspberry pi 自动发布天气信息到QQ空间/微博

raspberry pi 自动发布天气信息到QQ空间/微博

参考链接:

  https://aoaoao.me/951.html/comment-page-1

  http://www.ipip5.com/today/api.php?type=json

说明:

  天气信息来自于百度地图API,历史上的今天来自于网络API(见上).

准备工作:

  安装python(没有的,自行下载安装)

  安装requests:

git clone git://github.com/kennethreitz/requests.git
cd requests
python3 setup.py install

  安装python-rsa

git clone https://github.com/sybrenstuvel/python-rsa.git
cd python-rsa
python3 setup.py install

  安装qqlib

git clone https://github.com/JetLua/qqlib.git
cd qqlib
python3 setup.py install

主要脚本:

  备注:红色字体根据自己实际修改.

  main.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os
import urllib.request
import sys
import json
import time
import qqlib

def get_weather(city):
    api_key="you api key"
    weather_url="http://api.map.baidu.com/telematics/v3/weather?location="+city+"&output=json&ak="+api_key

    res = urllib.request.urlopen(weather_url)
    json_data = res.read().decode(‘utf-8‘)
    #print(json_data)
    json_data = json.loads(json_data)
    #get json data
    #check result status
    status = json_data[‘status‘]

    if status==‘success‘:
        results=json_data[‘results‘][0]
        pm25=results[‘pm25‘]
        weather_data=results[‘weather_data‘]
        date=weather_data[0][‘date‘]
        weather=weather_data[0][‘weather‘]
        wind=weather_data[0][‘wind‘]
        temperature=weather_data[0][‘temperature‘].replace(‘~‘,‘到‘)
        return ‘北京,今天是{},{} {},温度为{},PM2.5是{}.‘.format(date,weather,wind,temperature,pm25)
    else:
        return ‘获取百度API失败~‘

def get_today():
    api_url = "http://www.ipip5.com/today/api.php?type=json"

    res = urllib.request.urlopen(api_url)
    json_data = res.read().decode(‘utf-8‘)
    #print(json_data)
    if json_data==‘‘:
        return ‘获取历史上的今天失败~‘
    json_data = json.loads(json_data)

    today = json_data[‘today‘]
    year = json_data[‘result‘][0][‘year‘]
    title = json_data[‘result‘][0][‘title‘]

    return ‘{}年{}:{}‘.format(year,today,title)

weather = get_weather(‘beijing‘)
today = get_today()
text = ‘[天气自动播报] {}\n[历史上的今天] {}\n(此消息来自我家树莓派自动发送)‘.format(weather,today)

qqUser=‘qq user‘
qqPass=‘qq pass‘
wbUser=‘weibo user‘
wbPass=‘weibo pass‘

if os.path.exists(‘/home/pi/autopublish/data.txt‘):
    with open(‘/home/pi/autopublish/data.txt‘,‘wt‘) as f:
        f.write(text)
        f.close()
#        print(text)
else:
    print(‘file data.txt not exists‘)

#qq
qq = qqlib.QQ(qqUser,qqPass)
qq.feed(s)

try:
    os.system(‘python3 /home/pi/autopublish/weibo.py {} {}‘.format(wbUser,wbPass))
except Exception as e:
    print(‘Exception‘,e)
  weibo.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import requests
import json
import time
import os

class weibo:
    def __init__(self, username, password):
        self.__username = username
        self.__password = password
        try:
            self.cookies = self.__login__().cookies
            self.status = True
        except:
            self.cookies = None
            self.status = False

    def __login__(self):
        url = r‘https://passport.weibo.cn/sso/login‘
        header = {
            ‘Host‘:‘passport.weibo.cn‘,
            ‘User-Agent‘:‘Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25‘,
            ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
            ‘Accept-Language‘:‘zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3‘,
            ‘Accept-Encoding‘:‘gzip, deflate‘,
            ‘Content-Type‘:‘application/x-www-form-urlencoded; charset=UTF-8‘,
            ‘Pragma‘:‘no-cache‘,
            ‘Cache-Control‘:‘no-cache‘,
            ‘Referer‘:‘https://passport.weibo.cn/signin/login‘,
            ‘Connection‘:‘keep-alive‘}
        post_data = {
            ‘username‘:‘%s‘ % self.__username,
            ‘password‘:‘%s‘ % self.__password,
            ‘savestate‘:‘1‘,
            ‘ec‘:‘0‘,
            ‘pagerefer‘:‘‘,
            ‘entry‘:‘mweibo‘,
            ‘loginfrom‘:‘‘,
            ‘client_id‘:‘‘,
            ‘code‘:‘‘,
            ‘qq‘:‘‘,
            ‘hff‘:‘‘,
            ‘hfp‘:‘‘}
        try:
            response = requests.post(url, data = post_data, headers = header)
            #print u‘success\nuid:‘+json.loads(response.text)[‘data‘][‘uid‘]
            return response
        except:
            #print u‘failed‘
            return None

    def update(self, text):
        url = r‘http://m.weibo.cn/mblogDeal/addAMblog‘

        header = {
            ‘Host‘:‘m.weibo.cn‘,
            ‘User-Agent‘:‘Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25‘,
            ‘Accept‘:‘application/json, text/javascript, */*; q=0.01‘,
            ‘Accept-Language‘:‘zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3‘,
            ‘Accept-Encoding‘:‘gzip, deflate‘,
            ‘Content-Type‘:‘application/x-www-form-urlencoded; charset=UTF-8‘,
            ‘X-Requested-With‘:‘XMLHttpRequest‘,
            ‘Referer‘:‘http://m.weibo.cn/mblog‘,
            ‘Connection‘:‘keep-alive‘
        }

        post_data = {
            ‘content‘:text
        }
        try:
            response = requests.post(url = url, data = post_data, headers = header, cookies = self.cookies)
            #print json.loads(response.text)[‘msg‘]
            return response
        except:
            try:
                time.sleep(10)
                try:
                    self.cookies = self.__login__().cookies
                except:
                    self.cookies = None
                    return None
                response = requests.post(url = url, data = post_data, headers = header, cookies = self.cookies)
                #print json.loads(response.text)[‘msg‘]
                return response
            except:
                #print u‘send failed‘
                return None

if __name__ == ‘__main__‘:
    username = sys.argv[1]
    password = sys.argv[2]
    w = weibo(username, password)
    file_r = open(‘/home/pi/autopublish/data.txt‘)
    data_old = file_r.read()
    file_r.close( )
    w.update(data_old)

附录:

  百度天气API返回JSON示例:

{
    error: 0,
    status: "success",
    date: "2016-07-13",
    results: [{
        currentCity: "北京",
        pm25: "54",
        index: [{
            title: "穿衣",
            zs: "炎热",
            tipt: "穿衣指数",
            des: "天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。"
        },
        {
            title: "洗车",
            zs: "较适宜",
            tipt: "洗车指数",
            des: "较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"
        },
        {
            title: "旅游",
            zs: "一般",
            tipt: "旅游指数",
            des: "天气较好,同时又有微风伴您一路同行,但是比较热,外出旅游请注意防晒,并注意防暑降温。"
        },
        {
            title: "感冒",
            zs: "少发",
            tipt: "感冒指数",
            des: "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。"
        },
        {
            title: "运动",
            zs: "较适宜",
            tipt: "运动指数",
            des: "天气较好,户外运动请注意防晒。推荐您进行室内运动。"
        },
        {
            title: "紫外线强度",
            zs: "强",
            tipt: "紫外线强度指数",
            des: "紫外线辐射强,建议涂擦SPF20左右、PA++的防晒护肤品。避免在10点至14点暴露于日光下。"
        }],
        weather_data: [{
            date: "周三 07月13日 (实时:35℃)",
            dayPictureUrl: "http://api.map.baidu.com/images/weather/day/qing.png",
            nightPictureUrl: "http://api.map.baidu.com/images/weather/night/duoyun.png",
            weather: "晴转多云",
            wind: "微风",
            temperature: "35 ~ 23℃"
        },
        {
            date: "周四",
            dayPictureUrl: "http://api.map.baidu.com/images/weather/day/zhenyu.png",
            nightPictureUrl: "http://api.map.baidu.com/images/weather/night/yin.png",
            weather: "阵雨转阴",
            wind: "微风",
            temperature: "33 ~ 23℃"
        },
        {
            date: "周五",
            dayPictureUrl: "http://api.map.baidu.com/images/weather/day/yin.png",
            nightPictureUrl: "http://api.map.baidu.com/images/weather/night/yin.png",
            weather: "阴",
            wind: "微风",
            temperature: "31 ~ 22℃"
        },
        {
            date: "周六",
            dayPictureUrl: "http://api.map.baidu.com/images/weather/day/duoyun.png",
            nightPictureUrl: "http://api.map.baidu.com/images/weather/night/duoyun.png",
            weather: "多云",
            wind: "微风",
            temperature: "32 ~ 22℃"
        }]
    }]
}

  历史上的今天返回JSON示例:

{
    today: "07月13日",
    result: [{
        year: "1518",
        title: "中国明代医药学家李时珍出生"
    },
    {
        year: "1793",
        title: "雅各宾派主要领导人之一马拉逝世"
    },
    {
        year: "1900",
        title: "八国联军攻陷天津"
    },
    {
        year: "1908",
        title: "台湾画家李石樵出生于台北县新庄镇,一九九五年病逝于美国。"
    },
    {
        year: "1930",
        title: "第一届世界杯在乌拉圭开幕"
    },
    {
        year: "1942",
        title: "美国影星哈里森·福特出生"
    },
    {
        year: "1944",
        title: "魔方之父厄尔诺·鲁比克出生."
    },
    {
        year: "1953",
        title: "抗美援朝金城战役打响"
    },
    {
        year: "1954",
        title: "玻璃纸发明人布兰德伯格逝世"
    },
    {
        year: "1954",
        title: "墨西哥女画家弗里达·卡罗逝世"
    },
    {
        year: "1956",
        title: "中国第一批解放牌汽车试制成功"
    },
    {
        year: "1961",
        title: "奥地利作曲家勋伯格去世"
    },
    {
        year: "1983",
        title: "中国田径运动员刘翔出生"
    },
    {
        year: "2001",
        title: "北京申办2008年奥林匹克运动会成功"
    },
    {
        year: "2012",
        title: "水利水电工程专家潘家铮逝世"
    }]
}
时间: 2024-10-02 00:46:04

raspberry pi 自动发布天气信息到QQ空间/微博的相关文章

Raspberry Pi 自动挂载USB存储设备

简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储设备. 通过给linux下的设备管理服务udev添加规则配置文件,可以实现命令行下USB存储设备自动挂载 创建10-usbstorage.rules sudo vim /etc/udev/rules.d/10-usbstorage.rules 复制粘贴以下代码 KERNEL!="sd*",

Raspberry pi设置自动拨号,搭建无线路由环境

Raspberry pi设置自动拨号,搭建无线路由环境 前言 raspberry pi(树莓派), 是一款针对电脑业余爱好者.教师.小学生以及小型企业等用户的迷你电脑,由于可以烧录Linux操作系统,因此可以衍生出各种各样的使用途径,诸如控制版,爬虫机器,个人vps,门禁系统-..本文主要介绍如何在raspberry pi上面完成pppoe拨号上网功能,以及如何利用raspberry pi完成路由转发功能,进而将其作为一个家用无线路由器来使用. 准备环境 raspberry pi 三代 b+版

Raspberry pi 定时天气播报

Raspberry pi 定时天气播报 操作步骤: 1. 简单的写了python脚本 2. 添加定时计划里执行 3.使用百度的天气接口:http://api.map.baidu.com/telematics/v3/weather?location=city&output=json&ak=api_key 百度的语音合成接口:http://tsn.baidu.com/text2audio?tex=text&lan=zh&cuid=cuid&ctp=1&tok=t

[转]树莓派(Raspberry Pi)USB无线网卡自动连接

Raspberry Pi 使用USB无线网卡的时候不会因为路由重启而掉线. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash while true ; do    if ifconfig wlan0 | grep -q "inet addr:" ; then       sleep 60    else       echo "Network connection down! Attempting r

基于树莓派(Raspberry Pi)平台的智能家居实现(一)----继电器模块,DHT11模块

前言:    ??其实做这个智能家居系统我还是因为学校的毕业设计,距离上篇文章发布已经过去了20多天了,之前想着只是做一个烟雾报警,然后通过Zabbix进行报警,但是通过这20多天的设计,我发现实现报警的功能其实除了邮件,还有短信.微信.甚至电话.但是因为各种原因,比如.....钱0.0,哈哈哈,因此我计划用企业微信进行一个报警,然后貌似通过普通微信进行一个简单的交互(interactive),还是不错的选择,并且做出来的效果也很棒.??最后想说的是:"基于树莓派(Raspberry Pi)平台

Raspberry Pi开发之旅-发送邮件记录时间及IP

由于我使用树莓派的场景大多数是在没有显示器.只用terminal连接它的情况下,所以,它的IP地址有时会在重启之后变掉(DHCP的),导致我无法通过terminal连接上它.然后我又要很麻烦地登录路由器的管理界面里,去看它被分配到的新IP是什么,然后用terminal重连,太麻烦了,不是么?作为一个树莓派玩家,这种麻烦简直是无法接受的! 为了解决这个问题,我让Pi开机的时候,自动向我指定的Email发送一封邮件,告诉我它此次开机时的IP地址. 步骤: 开机时执行一个脚本,检测网络可用性→网络通畅

Raspberry Pi 摄像头模块应用程序文档翻译

http://dreamcolor.net/archives/raspicam-documentation.html —————————————————————————————————————————————————————————————————————— Raspberry Pi 摄像头模块应用程序文档翻译 更新日志: 2014 年 3 月 24 日更新:根据 2013 年 12 月更新的文档,对原译文进行扩展翻译.翻译完毕. 2014 年 3 月 4 日更新:根据 2013 年 12 月更

在树莓派2代B型/3代 上安装Fedora23 - Installing Fedora 23 on Raspberry Pi 2 model B or Raspberry Pi 3

本文主要用于记录安装过程,以便日后查阅回顾. 之前在自己的树莓派上运行的一直是通过NOOB安装的Raspbian,但是本人平时更喜欢用Fedora作为开发和使用环境,而且Raspbian上的软件包通常更新比较缓慢.因为树莓派2代B型上市前,树莓派的芯片都是armv6或者更早的架构,只能运行ARM架构的Raspbian或者Fedora 18及更早版本.树莓派2代B型搭载的芯片架构是armv7,树莓派3代搭载的芯片架构是armv8,这两种芯片都能够运行ARM架构的Fedora 23,而仅运行Rasp

Raspberry Pi AP功能改进: systemd服务封装以及dnsmasq的使用

前言在上一篇<Raspberry pi 设置自动拨号, 搭建无线路由环境>一文中,笔者利用hostapd和udhcpd程序,创建无线热点,实现地址分配以及DNS服务器的设置.本篇将基于上一篇的环境,对树莓派AP进行改进:使用dnsmasq代替udhcpd实现DNS以及地址租约,并将AP功能封装成为一个服务 上一篇中使用的hostapd以及udhcpd,其方式有一些缺陷: 使用命令行方式启动,并未将启动本身封装成为一个固定的"服务" 三代树莓派的内置网卡以及笔者使用的外置网卡