pythonjs设置_脚本转换小结——从js转为python

背景

上一篇提到的用户脚本,其实就是用来做一个网页挂机游戏的挂机脚本,有开着电脑,就可以开着网页挂机,机制也比较简单,定时发请求,检查请求,对于一些事件做处理,比如到了什么时间点该触发什么操作。由于本机firefox游戏打不开了,chrome经常莫名其妙地崩溃,于是改为用python来挂机,差不多,用的系统资源还少一些,毕竟chrome内存怪兽不是白叫的。js是本人工作中比较边角的语言,用的不多,python只是自学后用来简单抓取网页的,用的也不多。昨天用来一天时间写代码+测试,也是花了很久,下面简单介绍一下遇到的坑与注意点。

正文

1.定时器的选择

可以使用timer,sched,我选择用apscheduler。用pip install apscheduler之后,自动安装3.3.1版本,和2.x的是不一样的,主要提供了几个类型的定时器,这里的场景可以选择BlockingScheduler或BackgroundScheduler,简单的使用场景,试了一下都行。由于这里代码在运行过程中,需要人工输入命令来执行某些操作,BlockingScheduler试了一下输入没反应,于是使用后台任务BackgroundScheduler。js中用的是setTimeout来做延迟,python中直接使用time.sleep()就可以了。

关于这里的输入命令执行某个操作的代码,在windows下用了msvcrt,样例如下代码:

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

import time,datetime,msvcrt

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def opt():

scheduler.add_job(opt1, 'interval', seconds=6)

scheduler.add_job(opt2, 'interval', seconds=9)

scheduler.start()

def opt1():

print('opt 1')

def opt2():

print('opt 2')

if __name__ == '__main__':

opt()

flag = True

print(u'输入:b-操作1;c-清屏标记;d-操作2;q-退出')

while flag:

op = msvcrt.getch().decode(encoding='utf-8')

print(op)

if op == 'b':

opt1()

elif op == 'c':

print()

print(u'============== %s: 间隔清屏 ==============\r\n' % datetime.datetime.now())

elif op == 'd':

opt2()

elif op == 'q':

flag = False

else:

print('other ok!')

time.sleep(1)

scheduler.shutdown()

在使用定时任务的过程中,遇到了2种类型的错误,一个是maximum number of running instances reached (1),一个是apscheduler.executors.default:Run time of job "xxx" was missed by xxx。miss的这种错误,导致后面的程序不再执行了,进入一种假死状态,网上搜了一下,在官方说明中看到跟miss有关的配置,目前暂时没触发假死的状态,就是改了初始化,设置几个默认参数,比如misfire_grace_time,比如max_instances。对于misfire_grace_time,实际要设置什么值才有效还没探索出来。初始化的例子如下:

scheduler = BackgroundScheduler({

'apscheduler.executors.processpool': {'type': 'processpool','max_workers': '10'},

'apscheduler.job_defaults.coalesce': 'false','apscheduler.job_defaults.max_instances': '10',

'apscheduler.job_defaults.misfire_grace_time':20})

2.http请求的选择

可以用urllib,urllib2,httplib,我选择httplib2。js中直接封装一个ajax调用。

function ajax(options) {

options = options || {};

options.type = (options.type || "GET").toUpperCase();

if (window.XMLHttpRequest) {

var xhr = new XMLHttpRequest();

} else { //IE6及其以下版本浏览器

var xhr = new ActiveXObject('Microsoft.XMLHTTP');

}

xhr.onreadystatechange = function () {

if (xhr.readyState == 4) {

var status = xhr.status;

if (status >= 200 && status < 300) {

options.success && options.success(xhr.responseText, xhr.responseXML);

} else {

options.fail && options.fail(status);

}

}

}

xhr.open(options.type, options.url, true);

if (options.type == "GET") {

xhr.send(null);

} else if (options.type == "POST") {

xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xhr.send(options.params);

}

}

function httpGetTest() {

ajax({

url: url,

type: "GET",

success: function (response, xml) {

},

fail: function (status) {

}

});

}

function httpPostTest() {

ajax({

url: url,

type: "POST",

params: 'a=1&b=2&c=3',

success: function (response, xml) {

},

fail: function (status) {

}

});

}

python中这样使用

h = httplib2.Http()

#resp里面就是请求头的信息,content是具体内容,比如返回的是json字符串等,这里是字符类型,默认是get请求

(resp, content) = h.request(url)

#post请求,假装用的是chrome

(resp, content) = h.request(url, 'POST', 'a=1&b=2&c=3', headers={'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'})

3.其他遇到的问题

3.1字符、整型

js中字符拼接整型,直接用+拼接,python中需要转换类型,比如'str = ' + str(123)

3.2日期、时间戳

js中var d = new Date(timestamp) 和 d.getTime() 可以设置时间、获取长整形时间戳,python中d = time.localtime(timestamp) 和 round(time.time()) 可以设置时间、获取长整形时间戳

3.3判断非空问题

js判断一个object是否为空,function isEmpty(e) { for(var t in e) return !1; return !0;} python中判断数组、元组、字典就是 if not obj 就可以了。js判断object中是否包含某个key,需要遍历整个结构,python中if key in obj 或者 if key not in obj就可以了。

3.4类方法

python中调用类定义的某个方法,需要self.fun1(),如果直接fun1()会提示全局没有这个函数。如果函数定义的时候没传self,外部调用也是会失败的。

class Test():

def __init__(self):

print('init')

def func1(self, a):

print(a)

def func2(self, b):

self.func1(b)

print(b)

3.5json

js中json转换完可以直接obj.a,obj.b取值,python中,data = json.loads(str) 用data['a']获取值,其实就是字典。如果是json数组,就是data[i]['a']

3.6数组赋值

简单一点就是用循环赋值,也可以用另外一种方式

size = 10

#所有数组元素初始化为0

arr = [0] * size

#循环赋值

for i in range(size):

arr[i] = i

#另外一种赋值

arr = [i for i in range(size)]

#从对象数组取值

objs = [{'a':1,'b':2},{'a':2,'b':3},{'a':3,'b':4}]

arrb = [objs[i]['a'] for i in len(objs)]

#另外一个相对较灵活的例子

arr = [13,13,14,15,15,16,16]

l = len(arr)

ts = [ arr[i * 2] if i < (l+1)/2.0 else arr[(l - i) * 2 - 1] for i in range(l) ]

3.7输出字典

用ppring。p = pprint.PrettyPrinter(indent=4) p.pprint(obj)

用ppring的原因是不知道怎么输出print('obj = %r' % obj),后来知道了用%r,这个万能格式

3.8urlencode字符解码

python中没有urldecode,但是有unquote。只有在windows环境测过,不知道linux环境是什么样的输出。主要还是乱码问题比较麻烦,正常汉字都不会有问题,如果里面有其他特殊字符,print输出会报错。注释的是没其他字符的,正常输出,在有非汉字的其他字符时,try里面的print会报错,如果没有这个print,try模块后面的print会报错,也是说在执行print之前,编码出问题是没检查到的。

s = '%F0%9F%9A%80YaN'#'%E4%B8%AD%E6%96%87'

ss = ''

try:

ss = unquote(str(s)).decode('utf8', 'ignore')

print ss + '!!!!'

except:

ss = unquote(str(s)).decode('gbk', 'ignore')

print ss

暂时就这些,完。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值