kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

微信公众号自定义菜单

https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html

basic.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding: utf-8 -*-
# filename: basic.py
import urllib
import time
import json
class Basic:
	def __init__(self):
		self.__accessToken = ''
		self.__leftTime = 0
	def __real_get_access_token(self):
		appId = ""    # TODO
		appSecret = ""    # TODO
		postUrl = ("https://api.weixin.qq.com/cgi-bin/token?grant_type="
			   "client_credential&appid=%s&secret=%s" % (appId, appSecret))
		urlResp = urllib.urlopen(postUrl)
		urlResp = json.loads(urlResp.read())
		self.__accessToken = urlResp['access_token']
		self.__leftTime = urlResp['expires_in']
	def get_access_token(self):
		if self.__leftTime < 10:
			self.__real_get_access_token()
		return self.__accessToken
	def run(self):
		while(True):
			if self.__leftTime > 10:
				time.sleep(2)
				self.__leftTime -= 2
			else:
				self.__real_get_access_token()

menu.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# -*- coding: utf-8 -*-
# filename: menu.py
import urllib
from basic import Basic

class Menu(object):
	def __init__(self):
		pass
	def create(self, postData, accessToken):
		postUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s" % accessToken
		if isinstance(postData, unicode):
			postData = postData.encode('utf-8')
		urlResp = urllib.urlopen(url=postUrl, data=postData)
		print urlResp.read()

	def query(self, accessToken):
		postUrl = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=%s" % accessToken
		urlResp = urllib.urlopen(url=postUrl)
		print urlResp.read()

	def delete(self, accessToken):
		postUrl = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=%s" % accessToken
		urlResp = urllib.urlopen(url=postUrl)
		print urlResp.read()

	#获取自定义菜单配置接口
	def get_current_selfmenu_info(self, accessToken):
		postUrl = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=%s" % accessToken
		urlResp = urllib.urlopen(url=postUrl)
		print urlResp.read()

if __name__ == '__main__':
	myMenu = Menu()
	appid = ""    # TODO
	uri = ""  # TODO exp: http://www.abcxyz.xyz/ci/wx/openid
	postJson = """
	{
		"button":
		[
			{
		"type": "view",
		"name": "openid",
		"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
			},
			{
				"type": "view",
				"name": "测试",
				"url": "http://www.abcxyzkk.xyz/rs/wxmsg/test"
			}
		  ]
	}
	""" % (appid, uri)
	accessToken = Basic().get_access_token()
	#myMenu.delete(accessToken)
	myMenu.create(postJson, accessToken)

Python & tushare 实现命令行盯盘

https://blog.csdn.net/u011323949/article/details/102937856

依赖

1
2
pip install tushare
pip install pandas

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -*- coding:utf-8 -*-
import tushare as ts
import os
import threading
import time
from datetime import datetime

codes = ['000756', '601288', '601988', '601319', '600929']

while 1:
	try:
		df = ts.get_realtime_quotes(codes);
	except:
		print "get err\n";
		time.sleep(3);
		continue;

	os.system("clear")
	print datetime.now()
	for k in range(0, len(codes)):
		p1 = float(df['price'][k])
		p2 = float(df['pre_close'][k])
		print "%s %s %.3f %.3f %.3f%%" % (df['code'][k], df['name'][k], p1, p2, (p1 - p2) / p2 * 100)

	time.sleep(10);

udp vpn, 代理dota2

问题

手机端MTU有时是1300???,改大了似乎tcp不通,改成1350似乎没问题。 ifconfig rmnet_data0 mtu 1350

方案

用udp fullnat,起始点在包的末尾加上最终目标IP,中间点以目标IP为VIP建立session,最后点去除额外加的数据,然后发给目标IP

方法一

client(dota2):

1
2
3
4
5
6
7
8
9
10
11
12
ip route add default via 192.168.56.3 table 1
ip rule add to 103.10.0.0/16 table 1
ip rule add to 106.52.0.0/16 table 1
ip rule add to 139.45.0.0/16 table 1
ip rule add to 146.66.0.0/16 table 1
ip rule add to 153.254.0.0/16 table 1
ip rule add to 155.133.0.0/16 table 1
ip rule add to 162.254.0.0/16 table 1
ip rule add to 185.25.0.0/16 table 1
ip rule add to 190.217.0.0/16 table 1
ip rule add to 205.185.0.0/16 table 1
ip rule add to 205.196.0.0/16 table 1

client不用安装模块,通过策略路由将包导到本地虚拟机, 发出包 192.168.8.100:12345 –> 153.254.86.167:27023

start_point(local vm):

1
2
3
insmod ip_vs.ko; insmod ip_vs_wrr.ko
echo 192.168.8.103 > /proc/sys/net/ipv4/vs/laddr_v4_str
echo 106.52.108.171 > /proc/sys/net/ipv4/vs/default_dest_v4_str

收到包: 192.168.8.100:12345 –> 153.254.86.167:27023 发出包: 192.168.8.103:5001 –> 106.52.108.171:27023 在包的末尾加上153.254.86.167 收包和发包可以不在同一网卡

middle_point(gz):

1
2
insmod ip_vs.ko; insmod ip_vs_wrr.ko
echo 101.32.220.184 > /proc/sys/net/ipv4/vs/default_dest_v4_str

单纯转发

end_point(hk):

1
insmod ip_vs.ko; insmod ip_vs_wrr.ko

取出包的末尾153.254.86.167作为rs,去除末尾自己加的数据,然后转发

用法二:

client(dota2):

1
2
insmod ip_vs.ko local_out=1
echo 119.29.157.106 > /proc/sys/net/ipv4/vs/default_dest_v4_str

在包过local_out时修改目标IP为middle_ip、末尾加数据、建立session,session按cip:cport –> middle_ip:dport建,所以两条连接的cport、dport相同而dip不同则会冲突(TODO) 只换ip,没有重新路由,所以dip和middle_ip的出口需要在一张网卡上

middle_point(gz):

1
2
insmod ip_vs.ko; insmod ip_vs_wrr.ko
echo 101.32.220.184 > /proc/sys/net/ipv4/vs/default_dest_v4_str

end_point(hk):

1
insmod ip_vs.ko; insmod ip_vs_wrr.ko