【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令

哈喽大家好,我是鹏哥。

今天想记录的学习主题是 —— 基于pythonista3 app开发自己的iphone应用程序

~~~上课铃~~~

 

(由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文的背景音乐吧!)

あいの呗wacci - 感情百景(期间生产限定盘)

1

写在前面

之前看到翔哥发过一篇如何将安卓手机打造成Python开发环境,心生羡慕。可是由于不舍得那么多的英雄和皮肤,因此只能继续玩着iphone。

网上有很多人都说Appstore里也有 python的开发工具:Pythonista 3,售价68元。对这款app,大家的评价都被五毛党刷成:虽贵真香。抱着被骗的心态,我也花了68元大洋玩了。结果是:

真香!真香!

 

2

效果展示

本次开发的应用程序其实就是个小程序,但是不做标题党,没人关注呀是个查看杭州天气的功能。

桌面app:weather

运行结果:

点击桌面app图标或者通过siri “查看天气”:,都可以实现以下功能。

3

如何玩呢

下面我从零开始,一步步教大家如何开发属于自己的iphone应用。

(1)从Appstore下载pythonista 3

(2)安装pip依赖的环境脚本:stash库

python之所以简单易用,能通过Pip命令快速安装python库是其中重要的一个原因。因为如果在手机上开发python应用,自然也要安装各种依赖库。但是Pythonista 3本身并不支持pip命令,但是国外大神自己在GitHub上编写了程序,实现了iphone pip命令的调用。

有兴趣的同学,可以访问以下地址学习Pip具体实现的代码实现。

GitHub地址:https://github.com/ywangd/stash

那么我们如何在iphone上下载stash库呢?

很简单,在pythonista 3的console界面输入以下代码:

import requests as r;exec(r.get('https://bit.ly/get-stash').text)

 

Tips: 一直右划,就会划到console界面

 

(3)下载stash及调用launch_stach.py的坑:

如果你家网络不好,你就会遇到下面的报错了:HTTPSConnect连接超时。

这里有个办法可以规避,即用电脑直接从github网站上下载getstash.py,然后通过微信转给iphone。最后在iphone 执行getstash.py也可以成功下载stash库。

成功界面如下:

下载成功的stash库会在site-packagesX里(如下图,随机一个文件夹)

从这 里还可以看到Python2/3的标准库也被pythonista 3统一下载好了,太贴心!

     然后你会发现,怎么没有启动Pip的脚本:launch_stach.py呢?因为launch_stach.py被自动放到了iphone的最外层文件夹。

然后你就可以像电脑上一样,通过pip命令下载库了:

Tips: 有些库还是无法下载的,如Pyqt5

 

(4)编写python代码

说实话,在iphone上写爬虫代码有点傻,因为手机打字还是不方便。因此我是在电脑上编码,然后通过微信传到手机上实现的。

(5)在桌面上添加应用程序图标

在Pythonista 工具按钮里,有个Home Screen图标,即可将代码添加至iphone桌面上,如下图(为什么是通话中?因为welcome to join the conference……,某些同学懂)

(6)添加快捷命令到siri

选择创建快捷指令,然后选择脚本--pythonista3 运行脚本。这些操作按界面提示来即可,没什么难度了。然后就可以通过“嗨 Siri”来帮你自动运行python脚本了。是不是很屌?

4

示例代码

查看杭州天气的代码,可以查看之前的博客:【Python成长之路】python 从零学爬虫 -- 获取杭州天气

因此不再详细介绍代码了。

# coding=utf-8
# @Auther : "鹏哥贼优秀"
# @Date : 2019/7/28
# @Software : PyCharm

import random
from bs4 import BeautifulSoup
import requests

def getheaders():
    user_list = [
        "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
        "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
        "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
        "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
        "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
        "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
        "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
        "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
        "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
        "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
        "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
        "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
        "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
        "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
        "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01",
        "Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01",
        "Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01",
        "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01",
        "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"
    ]
    user_agent = random.choice(user_list)
    headers = {'User-Agent': user_agent}
    return headers


def weather():
    url = "http://www.weather.com.cn/weather/101210101.shtml"
    headers = getheaders()
    r = requests.get(url, headers=headers)
    r.encoding = 'utf-8'
    soup = BeautifulSoup(r.text, "lxml")
    lines = soup.find('li', class_="sky skyid lv2 on")
    date = lines.h1.get_text()
    weather = lines.p.string
    low_temp = lines.find('p', class_="tem").i.get_text()
    if not lines.find('p', class_="tem").span:
        high_temp = "未知"
    else:
        high_temp = lines.find('p', class_="tem").span.get_text()
    temp = high_temp + '-' + low_temp
    wind = lines.find('span', class_="NNW").get('title')
    windnumber = lines.find('p', class_="win").i.get_text()
    result = {
        "日期": date,
        "天气": weather,
        "温度": temp,
        "风向": wind,
        "风级": windnumber
    }
    print(u"日期:{0} \n天气:{1} \n温度:{2} \n风向:{3} \n风级:{4}".format(date, weather, temp, wind, windnumber))
    return result

if __name__ == "__main__":
    print('*****程序开始!******')
    weather()
    print('*****程序结束!******')

对了,要运行这段代码,需要在pyhonista中下载lxml库。如果不想下载,可以将soup = BeautifulSoup(r.text, "lxml") 改成,效果是一样的。

soup = BeautifulSoup(s, "html.parser")

 

5

总结

Pythonista3 在sample里有些很有意思的代码,如消消乐(300行代码实现的,大神是真的牛逼!、三维绘图等。

然后预告下周的博客主题,基于Pythonista 3开发自己的iphone入口,如下图。好啦,下周见!

~~~下课铃~~~

 

 

点击下方诗句,可以留言互动喔  

 

清风以北过南巷,南巷故人不知归。你本无意穿堂风,偏偏孤倨引山洪。

 

扫描二维码

    与鹏哥一起

学python吧!

发布了38 篇原创文章 · 获赞 17 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章