热点推荐

Q族秘技:强行给QQ陌生人发送消息

黑客防线 05年06月01日 【合作】 作者:

适合读者:普通网民、Q族
前置知识:VB编程基础
SocketQQ已经成为新时代网络的象征,可以毫不夸张地说:“不用QQ,就不算真正接触过网络”。时下无数菜鸟/高手都成天在QQ上挂着,闲聊/求教/讨论/学习……甚至谈情说爱无奇不有。或许绝大多数QQ使用者都会发现一个头疼的问题:无法给陌生人发送消息!比如因为生你气而拉你进黑名单的她(他)、拒绝添加好友的网吧邻座PLMM、心高气傲的技术牛人……他们都有一个共同的特点:就是不让你和她(他)说话!遇到这样的情况怎么办呢?如何批量给他们发送消息呢?请看下文……

Q族秘技:强行给QQ陌生人发送消息

  新版本的QQ提供了很多新的功能,但很多整天在网络上号称“我为聊狂”的朋友却没发现这些新的功能,实在是可惜。这不,最新的QQ可以和陌生人聊天,你知道吗?我听了也吃了一惊,立刻去试用,效果还不错。如果还没有用过这个功能的朋友可以去http://wpa.qq.com/msgrd?V=1&Uin=XXXXXXXX&Exe=QQ&Site=im.qq.com&Menu=yes试试。只要将“Uin=”后的XXXXXXXX换成对方的QQ号就可以直接给陌生人发送消息了。

  兴奋之余却又发现这个URL是有问题的,每次发送信息都要手工修改号码,而且在打开网页后会出现“是/否关闭网页”的对话框,很麻烦(如图1所示)。


Q族秘技:强行给QQ陌生人发送消息
 图1

  那有没有简单一点的方法一次给多个号码发消息,而且不出现这个对话框呢?方法当然是有的,用程序来实现就一劳永逸了。

  先说一下我的想法。这个功能的实现既然是通过网页打开的,那一定是在网页上做的文章,那我们就从网页入手,获取其并分析它的HTML代码,然后根据自己指定的QQ号对HTML作相应的修改并生成新的HTML,再在本地写入临时网页中,随后调用该网页打开QQ对话框并发送消息,最后关闭隐藏的网页并删除就OK了!下面我们就一步一步来编制这样的程序。

  分析网页

  输入上面给出的网址并回车,稍等片刻关闭对话框就会出现。在关闭的对话框上点“否”,然后单击右键选择查看源代码(如图2所示)。

Q族秘技:强行给QQ陌生人发送消息

图2

  看到“<script languagee="javascript" src="http://im.qq.com/js/checkqqclient.js">”这行了吧?它的作用是检测当前的QQ有没有打开。你可以下载那个JS文件看看,如果已经打开,它的返回值是TRUE(真),否则为FALSE(假);“location.href=”这行就是打开QQ的语句,由QQ来解释执行;还有“setTimeout('window.close()',1)”,它的作用就是在网页打开后弹出关闭对话框。

  程序初始化

  首先要申明需要使用的API函数、常量及全局变量,并获取当前完整路径,以便下面程序使用。代码如下:

'申明所用API函数、常量及全局变量
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const WM_CLOSE = &H10
Public Path As String
Public IEPath As String

'获取当前路径
If Right(App.Path, 1) = "\" Then
   Path = App.Path
Else
   Path = App.Path & "\"
End If

  获取参数
 
 这一步骤要从命令行读取各参数,比如指定的QQ号。它会对QQ号码进行判断,因为QQ号现在最短的是5位,最长是9位,其它长度的号码没有意义。如果参数格式错误或号码太短、太长,程序都会给出相对应的提示(如图3、4所示)。

Q族秘技:强行给QQ陌生人发送消息
 
图3

Q族秘技:强行给QQ陌生人发送消息
 
图4


代码如下:

'定义字符变量组,存放参数用
Dim Para() As String
'拆分各个参数
Para = Split(Command, " ", , vbTextCompare)
'判断是否有参数,没有则提示并结束程序
If UBound(Para) < 0 Then
   MsgBox "错误!没有参数!", vbCritical
   End
End If
'循环判断QQ号的长度,太短或太长则提示并结束程序
Dim i As Integer
For i = 1 To UBound(Para) + 1 Step 1
    If Len(Para(i - 1)) + 1 < 7 Or Len(Para(i - 1)) + 1 > 11 Then
       MsgBox "错误!QQ号码不存在!", vbCritical
       End
    End If
    '判断参数格式是否正确,不正确则提示并结束程序
    If Mid(Para(i - 1), 1, 1) <> "-" Then
       MsgBox "错误!格式不正确!", vbCritical
       End
    End If
Next

  生成网页

  这里需要将指定的QQ号码替换“location.href=”行中“Uin=”后的号码,并将“setTimeout('window.close()',1)”行删除,这样就不会再出现关闭对话框了。另外,“<title>”和“</title>”中间的字符需要改动,要将其修改为当前指定的QQ号,这是显示在浏览器顶部的标题。将修改好的HTML代码连接并写入网页文件,文件名为指定的QQ号,这样便于删除文件。代码如下:

'定义变量
Dim HTML As String '存放网页源代码
Dim QQNum As String '存放QQ号
Dim FileNum As Integer '存放自由文件号
'循环打开指定QQ号的聊天窗口
For i = 1 To UBound(Para) + 1 Step 1
    '获取指定的QQ号
    QQNum = Mid(Para(i - 1), 2)
    '合并网页源代码
    HTML = HTML & "<html>" & vbCrLf
    HTML = HTML & "<head>" & vbCrLf
    HTML = HTML & "<title>" & QQNum & "</title>" & vbCrLf
    HTML = HTML & "<script language=""" & "javascript""" & " src=""" & "
http://im.qq.com/js/checkqqclient.js""" & "></script>" & vbCrLf
    HTML = HTML & "</head>" & vbCrLf
    HTML = HTML & "<body>" & vbCrLf
    HTML = HTML & "<script>" & vbCrLf
    HTML = HTML & "var boolFals=IsInstallQQ();" & vbCrLf
    HTML = HTML & "if(boolFals==true)" & vbCrLf
    HTML = HTML & "{" & vbCrLf
    HTML = HTML & "location.href='Tencent://Message/?Menu=yes&Uin=" & QQNum & "&websiteName=ioshenmue'" & vbCrLf
    HTML = HTML & "};" & vbCrLf
    HTML = HTML & "</script>" & vbCrLf
    HTML = HTML & "</body>" & vbCrLf
    HTML = HTML & "</html>"
    '设置错误陷阱,防止程序出错崩溃(在文件操作中很容易出错,并导致程序崩溃)
    On Error Resume Next
    '判断指定QQ号对应的网页是否存在,存则则删除
    If Dir(Path & QQNum & ".htm") <> "" Then Kill (PathPath & QQNum & ".htm")
    '获取自由文件号
    FileNum = FreeFile()
    '以添加方式打开网页文件
    Open Path & QQNum & ".htm" For Append As FileNum
    '写入源代码
    Print #FileNum, HTML
    '关闭文件
    Close FileNum
    '取消错误陷阱
On Error GoTo 0
'将网页源代码变量清空,防止下次重复使用
HTML = ""
Next

  打开QQ对话框

  这个步骤是读取注册表以获取浏览器的完整路径和文件名。这里我使用的是IE,利用程序调用IE打开相应的网页,并设置为隐藏运行。这里的gfsGetKeyStringValue函数是我自定义的。代码如下:

'获取IEXPLORE.EXE的完整路径,以便程序调用
IEPath = Trim(gfsGetKeyStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE", ""))
'调用IE打开生成的网页
Call Shell(IEPath & " " & Path & QQNum & ".htm", vbHide)

  关闭窗口及删除文件

  在打开隐藏网页后,QQ的聊天窗口会被打开,在这个过程中需要一点时间,所以要在这里设置一个程序的休眠时间,防止网页没有正常打开就被关闭、删除了。我的方法是在正常打开网页后,在系统中遍历查找网页标题,同时结合IE的类名,以便提高查找的准确性。获取类名可以先打开一个IE窗口,用MS提供的SPY++来获取(如图5所示),找到后将其关闭,同时删除对应的文件。

Q族秘技:强行给QQ陌生人发送消息
 
图5


完整代码如下:

'将程序停止5秒,防止下面误操作
Sleep 5000
'关闭IE
Call PostMessage(FindWindow("IEFrame", QQNum & " - Microsoft Internet Explorer"), WM_CLOSE, 0, 0)
'删除刚生成的网页
Kill (Path & QQNum & ".htm")
  
小知识:上面的代码中用到了几个API函数,说明一下其功能和各自的调用格式:
  1.Sleep的作用是让程序停止一段时间,调用格式是“Sleep(停止时间)”,单位是毫秒。
  2.PostMessage的作用是向指定的程序发送一个消息,这里就是关闭IE的消息,调用格式为“PostMessage(对象句柄,指定的消息,消息参数1,消息参数2)”,这里的消息参数视不同情况而定。
  3.FindWindow的作用是查找制定窗口的句柄,这里提供给PostMessage使用,调用格式是“FindWindow(指定窗口的类名,指定窗口的句柄)”。
  
至此代码完成,剩下就是编译调试了。最后获得完整程序,使用方法如图6所示。

Q族秘技:强行给QQ陌生人发送消息
 
图6

  这里我将程序命名为OPENQQ.EXE,命令行格式为“OPENQQ.EXE -QQ号 -QQ号 -QQ号……”,这样就能给陌生人群发消息了!好了,程序就留给大家玩吧,有问题请到我的留言版来(http://www.xzcx.net.cn/lyb/index.asp?user=smallrascal),随时欢迎!
(文中涉及程序已收录到杂志配套光盘“杂志相关”栏目,按文章名查找即可)

请您为本文做个评价:
价格及相关信息不准请拨打 ZOL(7 X 8)小时免费投诉电话:400-678-0068-6 免费拨打ZOL客务电话
文章评论
笔记本,台式机 拨打800-858-2339,为您量身打造!