找回密码
 加入
搜索
查看: 5729|回复: 6

[原创] [把单词批量导入扇贝词串]第一个拙作,让大家见笑。请多多指教!

  [复制链接]
发表于 2013-3-20 21:17:13 | 显示全部楼层 |阅读模式
本帖最后由 MaGiCmAn 于 2013-3-21 15:51 编辑

以下脚本稍微简化把单词表导入到扇贝词串的操作:


$file=fileopen("1.txt",0) ;打开“1.txt”文件,该文件中每个单词一行


while 1

$words=filereadline($file) ;读取单词
   if @error=-1 then ExitLoop ;判断单词是否全部读取
  

   Sleep (100)
    ControlSend("词串: 1 - Google Chrome",  "", "Chrome_RenderWidgetHostHWND1", "^a")
   ControlSend("词串: 1 - Google Chrome",  "", "Chrome_RenderWidgetHostHWND1", $words)
ControlSend("词串: 1 - Google Chrome",  "", "Chrome_RenderWidgetHostHWND1", "{ENTER}")
;“词串: 1 - Google Chrome”是我用chrome打开扇贝建立好词串“1”后的输入单词界面,使用脚本前需要把焦点放在输入框里

WEnd


目前想到可以改善的地方很多:
1,自动获取浏览器窗口名称
2,导入单词的时候,在网站提示“单词添加失败,单词未找到”时,把导入失败的单词存到另一个文件中
3,在词串满了的时候,自动建立下一个词串,继续导入
……
虽然限于水平,许多想法还不能实现,但我相信通过向各位高手学习,假以时日一定能使脚本充分完善起来。
发表于 2013-3-21 01:27:27 | 显示全部楼层
鼓励新人,加油。
发表于 2013-3-21 07:48:37 | 显示全部楼层
挺好的。。。支持你。。。
 楼主| 发表于 2013-3-21 15:49:41 | 显示全部楼层
本帖最后由 MaGiCmAn 于 2013-3-21 15:54 编辑

抄了一段后台取色代码,加入了把导入失败的生词记录到2.txt文件中的功能。新脚本如下:

#include <GDIPlus.au3>

;下面是后台取色用到的函数:
Func _PosColorRead($hWnd,$PosX,$PosY)
        ;定义程序必须的变量
        Local $iColor,$PosArray,$X=$PosX,$Y=$PosY
        ;调用函数抓取窗体 从0,0到X,Y的 区域 返回的是一个数组. 多抓取的5个像素点是为了给图片做冗余,防止读不出该坐标的颜色.
        $PosArray=LToArray($hWnd,$X+5,$Y+5)
        ;从数组中读出要读取的坐标的颜色.
        $iColor = $PosArray[$PosX][$PosY]
        ;返回该颜色
        Return $iColor
EndFunc

Func _WinCapture($hWnd, $iWidth = -1, $iHeight = -1)
        ;定义程序必须的变量
        Local $iH, $iW, $hDDC, $hCDC, $hBMP
        ;如果调用该函数时候没指定宽和高,则调用AIP获取窗口的宽和高作为抓图区域的宽和高
        If $iWidth = -1 Then $iWidth = _WinAPI_GetWindowWidth($hWnd)
        If $iHeight = -1 Then $iHeight = _WinAPI_GetWindowHeight($hWnd)
        ;创建一个DC句柄
    $hDDC = _WinAPI_GetDC($hWnd)
        ;创建一个与DC句柄兼容的内存句柄
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
        ;从DC句柄创建一个宽高为调用值的位图句柄
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
        ;将位图句柄复制到内存区域中去
    _WinAPI_SelectObject($hCDC, $hBMP)
        ;用 printwindow 取得程序窗口
    DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
        ;释放DC句柄
    _WinAPI_ReleaseDC($hWnd, $hDDC)
        ;释放内存句柄
    _WinAPI_DeleteDC($hCDC)
;~     _ScreenCapture_SaveImage(@DesktopDir&"\window.jpg", $hBMP)
    ;返回创建好的位图句柄
    Return $hBMP
EndFunc

Func LToArray($hand,$iWidth=-1,$iHeight = -1);成功则返回数组.失败返回0.
        ;定义子程序必须的变量
    Local $hBitmap, $BitmapData, $i_width, $i_height, $Scan0, $pixelData, $s_BMPData, $i_Stride
        ;初始化GDI+库
        _GDIPlus_Startup()
        ;如果调用函数时候没有指定宽和高, 则调用API获取宽和高.
        If $iWidth = -1 Then $iWidth = _WinAPI_GetWindowWidth($hand)
    If $iHeight = -1 Then $iHeight = _WinAPI_GetWindowHeight($hand)
        ;调用函数获取指定窗体的位图句柄.
        $hBMP = _WinCapture($hand, $iWidth, $iHeight)
        ;从位图句柄创建Bitmap对象
        $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
        ;如果未创建成功,则直接退出.未创建成功可能是因为无效的图形句柄
        If @error Then
                _GDIPlus_ShutDown ()
                Return 0
        EndIf        
        ;获取位图句柄的宽和高.
        $i_width = _GDIPlus_ImageGetWidth($hBitmap)
        $i_height = _GDIPlus_ImageGetHeight($hBitmap)        
        ;锁定位图句柄中用于输入输出的部分. 将位图句柄中的数据格式格式化成24位的RGB格式.
    $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $i_width, $i_height, $GDIP_ILMREAD, $GDIP_PXF24RGB)
        ;以下几句可能是BMP的数据格式, 我不懂. 这是大牛阿福给的
    $i_Stride = DllStructGetData($BitmapData, "Stride")
    $Scan0 = DllStructGetData($BitmapData, "Scan0")
    $pixelData = DllStructCreate("ubyte lData[" & (Abs($i_Stride) * $i_height) & "]", $Scan0)
    $s_BMPData = DllStructGetData($pixelData, "lData")
    $s_BMPData = StringTrimLeft($s_BMPData,2)
        ;解锁BMP位图数据区块.
    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
        ;销毁位图句柄
    _GDIPlus_ImageDispose($hBitmap)
        ;删除位图对象.
        _WinAPI_DeleteObject ($hBitmap)
        ;关闭GDI库
        _GDIPlus_Shutdown()
        ;定义变量.
        Local $a_return[$i_width][$i_height], $x=$i_width-5, $y=$i_height-5, $s
        ;从位图数据中取出指定的那行.
        $s=StringMid($s_BMPData, $y*($i_Stride*2)+1, $i_width*6)
        ;从该行中读出指定的那个坐标.
        $a_return[$x][$y]= StringMid($s,$x*6+1 ,6)
        ;BGR转RGB.
        $a_return[$x][$y]= "0x"&StringRight($a_return[$x][$y],2)&StringMid($a_return[$x][$y],2,2)&StringLeft($a_return[$x][$y],2)
        Return $a_return
        EndFunc
       

$file=fileopen("1.txt",0) ;将单词输入到“单词.txt”文件中,单词与词义用“:” 分隔,每个单词一行


while 1

$line=filereadline($file) ;读取单词
   if @error=-1 then ExitLoop ;判断单词是否全部读取

  ControlSend("词串: 老友记四级以上高频词 - Google Chrome",  "", "Chrome_RenderWidgetHostHWND1", "^a")
   ControlSend("词串: 老友记四级以上高频词 - Google Chrome",  "", "Chrome_RenderWidgetHostHWND1", $line)
ControlSend("词串: 老友记四级以上高频词 - Google Chrome",  "", "Chrome_RenderWidgetHostHWND1", "{ENTER}")
    Sleep (100)
       
$hwnd=WinGetHandle("词串: 老友记四级以上高频词 - Google Chrome")
$Color=_poscolorread($hwnd,335, 395)
;后台取色

If $Color=0xF2EDDE Then
           ControlSend("2.txt - 记事本",  "", "Edit1", $line)
ControlSend("2.txt - 记事本",  "", "Edit1", "{ENTER}")
EndIf
WEnd
 楼主| 发表于 2013-3-21 15:53:29 | 显示全部楼层
抄的代码源自这里http://www.autoitx.com/thread-16342-1-1.html
感谢lanfengc。
另外,这个后台取色好像与Au3Info.exe取出来的数值上有些许差异,限于水平没有找到原因。
发表于 2013-3-22 00:21:07 | 显示全部楼层
不开源的话意义不大
 楼主| 发表于 2013-5-14 22:18:26 | 显示全部楼层
本帖最后由 MaGiCmAn 于 2013-5-14 22:19 编辑

修改了一下,不用模拟按键而改用ie操作,简单了许多,误操作也少了许多。

#include <IE.au3>
Local $wedsite=InputBox("输入网址","","http://www.shanbay.com/wordlist/11111/")
Local $oIE = _IECreate($wedsite)
;Local $oForm = _IEFormGetObjByName($oIE, "0")
Local $oQuery = _IEGetObjById($oIE, "to_add_vocabulary")
;捕获单词输入框
$file=fileopen("1.txt",0) ;打开1.txt——预先将单词输入到“单词.txt”文件中,每个单词一行
$file2 = FileOpen("2.txt",129)
while 1
  $line=filereadline($file) ;读取单词
   if @error=-1 then ExitLoop ;判断单词是否全部读取
;输入单词
_IEFormElementSetValue($oQuery, $line)
Local $hwnd = _IEPropertyGet($oIE, "hwnd")
_IEAction($oQuery, "focus")
ControlSend($hwnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "{Enter}")
;发送回车
Sleep(500)
Local $sHTML = _IEDocReadHTML($oIE)
$check=StringRegExp($sHTML,"alert alert-error",0)
;检测是否添加成功
If $check=1 Then
FileWrite($file2,$line & @CRLF)
EndIf
;把没有添加成功的单词写到2.txt
WEnd
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 14:14 , Processed in 0.073817 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表