.LOG

CTerm Python脚本支持简介

目前为止，Enable python后可以做到：
 >更准确的url识别。由于采用了python的正则表达式，误识别率大大降低。可以识别跨行URL
 >可定制的状态识别，目前以关键字为主
   (若发现有状态识别不正确，导致功能失效，可自己按情况添加修改关键字，甚至修改识别算法)
 >CTerm启动时连接站点(OnCTermStart)
 >自定义命令中可以执行python语句或脚本
 >编写python脚本完成自动任务
 >...

脚本(包括vbs等脚本)默认放在CTerm运行目录的script子目录下
可以通过修改配置参数ScriptDir定制

脚本分两类：系统控制脚本与用户脚本
前者即ct_system.py及相关脚本，必须位于上述ScriptDir下
由CTerm调用，提供各种事件。其中事件的响应函数中的代码可由用户自己编写

用户脚本是用户编写的任意脚本，由用户手动，或通过自定义命令执行，也可以通过事件响应函数调用
不必一定位于ScriptDir下


运行环境：
CTerm 3.262 build 060830 +
Python 2.5 +
Python下载地址: http://www.python.org/download/

注：不安装python也可以运行，可以从附带的python2x.zip及Dlls, Lib等目录导入模块，同时还需要python2x.dll
只是如果你写的脚本需要用到附带文件中不包含的模块，如email,ftp什么的，就找不到了:(

◆ CTerm事件
CTerm脚本目前能够响应的事件如下(事件名称基本兼容STerm)：

OnCTermStart() //CTerm启动，关闭事件
OnCTermClose()

antiIdle(ID) //防发呆。参数为窗口唯一标识，以下同
OnTimer(ID)		//每秒触发一次
OnDataCome(ID) //数据到来时触发，这时显示完成，状态识别也已完成(目前由CTerm进行识别状态)
					 //在其中set与clear ID对应的dataEvent，以通知等待数据的线程
OnSessionOpen(ID) //当打开一个子窗口时触发
OnSessionClose(ID) //当关闭一个子窗口时触发

//下面为鼠标键盘事件
OnMouseMove(ID, x, y) //x, y为字符位置，下同
OnLButtonUp(ID, x, y)
OnRButtonUp(ID, x, y)
OnMButtonUp(ID, x, y) //中键或鼠标滚轮按下
OnKeyDown(ID, nChar, nRepCnt, nFlags) //这个nFlags很可能会出问题，所以不可靠
//OnKeyDown可返回值1(按键已经由该函数处理，不需要cterm处理)，或0
//格式return (1,) 或(0,)

OnParseURL(ID, x, y) //需要解析URL时调用

OnGetStatus(ID)	//以关键字识别为主，若出现状态识别不正确
		//可自己根据情况修改站点配置数据文件sitestatus.py
		//若仍不能满足需要，亦可改写数据结构和OnGetStatus()及相关函数，实现新的更细致的算法
		//站点类型与状态常数见sitestatus.py
OnGetMessage(ID) //暂为空

◆ CTerm内建模块
提供了一组可由Python调用的功能函数，用以访问CTerm内部数据或方法
使用前需用import CTerm导入(系统脚本或用户脚本中)
调用格式(用from CTerm import *导入，可省略前面的CTerm.):
CTerm.GetSiteType(ID, [...])

大部分模块函数都需要一个ID为参数，以指明对哪个窗口操作
此ID可以由sys.argv取得，也可手动调用CTerm.GetSessionID()取得，或者由事件响应函数给出

提供的函数如下(函数名称与qterm或sterm基本兼容)：
- GetSessionID(n=None) //n为窗口序号，若未指定，取当前窗口
- GetSessionNum() //子窗口个数
- SetScriptInfo(s) //设置状态栏信息

- GetWorkDir() //取cterm工作目录
- GetScriptDir() //取默认python脚本路径

- GetSiteType(ID) // ID为窗口标识，下同
- GetSessionName(ID)		// 地址薄中的站点名
- GetHostAddress(ID)
- GetHostPort(ID)
- GetLoginID(ID)		// 自动登录时的ID与密码
- GetLoginPW(ID)
- GetTermWidth(ID=None)	//term列数, None时取当前窗口，无子窗口时取全局参数。
- GetTermHeight(ID=None)//term行数

- GetStatus(ID) // 取CTerm内部已经识别完成的状态，若使用了OnGetStatus，可siteStatus字典亦可用(除ST_MESSAGE)外
- GetSubStatus(ID)

- GetText(ID, start, end=-1, scrn=0) //拷贝从start到end行的屏幕文本, end=-1时只拷start一行; scrn=0末屏，1当前屏，2：绝对行数
- GetAttrText(ID, start, end=-1): 取ANSI文本。参数含义同GetText
- GetSelectText(ID) //选定文本，若无选定，复制全屏

- SendString(ID, s) //直接发送数据
- SendParsedString(ID, s)
				//解析后发送，其中可包含支持的转义序列，变量等，参见“转义序列.txt”
				//事实上由于Python支持所有的转义序列，所以该函数存在的意义不大
				//除了需要使用CTerm特殊的转义符外，一般用SendString即可
- CaretX(ID)
- CaretY(ID)

- IsConnected(ID)
- Disconnect(ID)
- Reconnect(ID)	//连接断开且窗口未关闭时重连
  ConnectSite两种调用方式:
- ConnectSite(siteName) //siteName为地址薄中的站点名
- ConnectSite(address, port)

- SendCommand(cmdid) //执行CTerm内部命令，允许执行的命令见cterm_command.py
- GetPicture(url) //调用内部图片浏览器下载显示图片

- AntiIdleString(ID, s=None): 取/设防呆串, ID为-1则取/设全局防呆串
- AntiIdleTime(t=None): 取/设防呆时间(秒)
- SetAutoReply(s=None) //设置自动回复的消息串, s=None时取消自动回复

◆ 关于session ID:
python callback函数(事件响应函数)的参数ID由CTerm产生事件时给出
每个expose函数都需要一个ID，如果没有。。。是不行的

在执行用户脚本或代码时，sys.argv[0]是系统传过来的调用窗口的ID
可用它来对调用窗口操作(先用long()把字符串转成整数)
若调用时没有活动窗口，该值为-1，不可执行需要ID的CTerm模块函数
若要对其它窗口：如对第i个窗口操作，先用GetSessionID(i)取得其ID
i为-1或未给出，表示活动窗口

◆ 用户脚本与用户代码
用户代码与用户脚本基本性质相同，只是前者不单独存成一个文件，而直接由自定义命令给出
一般用于执行代码量很少、较简单的工作

执行用户脚本时可由sys.argv或GetSessionID()取得调用该脚本的窗口ID：
ID=long(sys.argv[0])

在用户脚本中，如果有自定义函数，比如fun()
若fun()需要访问该脚本中函数外部定义的变量或函数，则它们必须显式声明为global
这是因为脚本本身是在CTerm内部的Python环境内执行的，脚本中的对象全是local对象

用户脚本的执行环境被设为ct_system，所以系统脚本中的所有变量与函数对用户脚本均是可见的
包括事件与状态变量。所以可以在其中等待dataEvents(当数据到来时由系统脚本触发)

◆ 输出与错误信息
sys.stdout与sys.stderr被重定向为CTerm执行目录下的python.cterm.log
在调试脚本时可以参考该文件中的输出
python.cterm.log和python.error.log两个log文件可用CTerm.ini中的参数PythonLog关闭


◆ 相关文件
python2x.dll          		基本Python语言支持
python2x.zip        		Python模块支持
msvcrxx.dll			python2.5以后的版本调用
python.cterm.log		python的输入及出错信息
python.error.log		python的出错信息(供状态栏双击打开)
<DLLs>				Python模块所用到的动态链接库
<Lib>				Python模块
<script>			系统脚本和工具脚本及相关数据、说明文档

script目录下：
globals.py			其中导入以下各模块，为用户脚本建立执行环境
ct_system.py			系统事件回调函数
sitestatus.py			状态常数(供状态识别函数OnGetStatus用)
cterm_command.py		内部命令常数，用于OnSendCommand函数(不得更改)
tools.py			辅助函数，其中部分函数由CTerm.exe内部调用
onstart.py			启动时(ct_system.py, OnStart)自动执行的脚本，它调用onstart.lst中的模块
onstart.lst			启动时执行的模块列表

GetAllPic.py			连续看图
uppic.py			将截图存盘并贴图
uppic1.py			贴图
img_save.py			截图存盘
postmilti.py			文件上传模块
setupdw.py			启动时提示安装调试信息，已取消自动执行，可手动执行

continuous*.py			灌水机;)
CopyArticle.py			文章下载，未完成
download*.py
test.py				测试

其它				测试与示例
*.pyc				执行过程中产生的中间编译结果

◆ 脚本更新历史(ct_system.py, tools.py)

# 15:40 2008-1-9
# 改进email的识别，支持形如user+tag@gmail.com的email
#
# 0:42 2008-1-4
# 支持形如72.43.]的IP(mitbbs)
#
# 12:05 2007-11-30
# 状态识别和url解析支持可变term行列数
#
# 14:20 04-10-7
# epathch增加@, urlexp1增加中的用户名部分@，长度增至30
# 不知是否会出问题...
# 
# 20:36 04-9-25
# 状态识别，可用正则表达式
# 子状态改用字典；可设多条(行，关键字)规则
# 改这些只是为了判断水木与白云的离站选单
#
# 14:17 04-9-24
# URL按照bat的建议，分析顶层域名，排除了大多数文件名
# 允许断线自动重连(OnSessionClose)
# 
# 6:58 04-9-2
# 状态识别OnGetStatus, OnGetMessage
# 启动、关闭事件OnCTermStart, OnCTermClose
#
# 10:37 04-9-1
# 改进了跨行URL识别，支持未名上某些跨行但行末带有1到数个空格(设为最多3个)的URL
# 支持白云黄鹤上中文文件名后仍有一串字符的URL
# 
# 14:48 04-8-31
# 实现了系统脚本与其它脚本线程之间的通信
# 提供了dataEvents，当有数据到来时被set，随即clear
# 在其它脚本或事件函数中可以wait相应的dataEvents[ID]
# 但是不要直接dataEvents[ID].wait要用tools.py里面的Wait(ID)
# 
# 4:04 04-8-29
# OnParseURL:
# 跨行URL识别，最多识别3行
# 
# 22:38 04-8-27
# OnParseURL:
# 识别www，ftp，bbs等字样
# 将url，proxy，email分开，更条理、清晰些，也应该更准确，范围更广些
#
# 10:23 04-8-26
# OnParseURL：
# 支持中文URL，排除全数字非IP的URL，可识别出扩展名, 代理email，自动添加协议头
# 界定有效搜索范围，理论上提高了识别的效率，特别是对空格等无效字符，一测试即返回
#
# 9:20 04-8-26
# 提供了基本的连接、数据、键盘、鼠标事件
# 一个实用的功能：解析URL
# 
# 9:17 2007-10-29
# OnKeyDown带返回值
# URL解析增加bAutoHeader参数
#

13:48 2011-6-13
