網(wǎng)上有很多關(guān)于pos機(jī)api接口,Go集合VC實(shí)現(xiàn)簡(jiǎn)單的QQ消息派發(fā)接口的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)api接口的問題,今天pos機(jī)之家(m.nxzs9ef.cn)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
pos機(jī)api接口
不少微信QQ機(jī)器人大多通過分析通訊包,模擬包方式實(shí)現(xiàn)消息的發(fā)送,該方式會(huì)隨著QQ 微信的升級(jí)兒很容易失效需要不斷升級(jí)。通過模擬界面操作方式雖然也存在界面改變失效的問題,但該方式相對(duì)協(xié)議方式失效的周期應(yīng)該更長(zhǎng)一點(diǎn)。閑來無事兒,實(shí)現(xiàn)一個(gè)簡(jiǎn)單QQ消息投送,原理主要通過Go實(shí)現(xiàn)web接口便于外部通過瀏覽器或http或websocket接口給指定的QQ發(fā)送消息,web服務(wù)接收到消息后,通過回調(diào)函數(shù)通知VC實(shí)現(xiàn)對(duì)指定QQ窗口操作完成消息的發(fā)送
VC主要通過查找指定QQ號(hào)主窗口,查找要發(fā)送QQ消息的QQ號(hào),模擬點(diǎn)擊,模擬鍵盤輸入,實(shí)現(xiàn)消息的投送
Go編寫dll由VC調(diào)用
主要代碼實(shí)現(xiàn)如下
Go部分
//Go導(dǎo)出函數(shù)便于VC調(diào)用
/*
#cgo CFLAGS: -I .
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void (*callback)(int,void *,int,void *,int);
extern void c_callback (int,void *,int,void *,int);
extern callback _cb;
*/
import "C"
import "unsafe"
/*以下兩行標(biāo)識(shí)導(dǎo)出特別重要*/
//InitHttpWebSocket :
//export InitHttpWebSocket
//初始Web服務(wù)和websocket服務(wù),node為websocket接口調(diào)用名,nPort為web服務(wù)接口,pClass為VC的類指針,p為回調(diào)函數(shù)
func InitHttpWebSocket(node string, nPort int, pClass int, p C.callback) (bool, string) {
//myConfig := new(Config.Config)
//sInitFile := Share.GetCurrentDirectory() + "/web/conf/app.ini"
//myConfig.InitConfig(sInitFile)
m_AddrMap = make(map[string]OneWSLink)
if p != nil {
C._cb = p
//WebSocketCallBack(0, "call OK", 4)
pSaveClass = pClass
}
t1 := time.Now()
go InitHTTP(t1, nPort, node)
str := "正在初始化"
WebSocketCallBack(pSaveClass, "", 0, str)
return true, "正在初始化"
}
//數(shù)據(jù)處理函數(shù)
func ActionAPI(res http.ResponseWriter, req *http.Request, ModeName, FName string, m_VarHH map[string]interface{}) {
fmt.Println(ModeName, FName)
var m_ReturnJson Returnjson
switch ModeName {
case "CORESYS.SYS":
switch FName {
case "API":
//獲得參數(shù)核實(shí)參數(shù)合法性
ok, _ := GetParameValues(m_VarHH, "appid", "sign", "action")
if !ok {
m_ReturnJson.BOK = false
m_ReturnJson.Smsg = "缺少必要參數(shù)"
NETReturnData(res, req, m_ReturnJson)
return
}
var keyArray = [...]string{}
keyArrayT := keyArray[:]
for k, _ := range m_VarHH {
if k != "sign" {
keyArrayT = append(keyArrayT, k)
}
}
sort.Strings(keyArrayT)
fmt.Println(keyArrayT)
_, appid := GetParameValue(m_VarHH, "appid")
_, sign := GetParameValue(m_VarHH, "sign")
appkeyString := ""
if isDBSave {
fmt.Println("采用數(shù)據(jù)庫(kù)存儲(chǔ)")
ok, m_Rows := m_baseDB.XNGetRecord(false, "select appkey from sys_apps where appid=?", appid)
if ok {
if len(m_Rows) == 0 {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "未能查詢到appid:" + appid
NETReturnData(res, req, m_ReturnJson)
return
}
appkey, ok := m_Rows[0]["appkey"]
if ok {
appkeyString = appkey.(string)
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "查詢appid:" + appid + "的appkey失敗"
NETReturnData(res, req, m_ReturnJson)
}
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "查詢appid:" + appid + "失敗"
NETReturnData(res, req, m_ReturnJson)
return
}
} else {
fmt.Println("采用INI存儲(chǔ)")
m_oneApp, ok := m_AppIDMAP[appid]
if ok {
appkeyString = m_oneApp.AppKey
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "查詢appid:" + appid + "失敗"
NETReturnData(res, req, m_ReturnJson)
return
}
}
ok, m_PArray := GetParameValues(m_VarHH, keyArrayT...)
str := ""
for i := 0; i < len(m_PArray); i++ {
str += m_PArray[i]
}
str += appkeyString
fmt.Println("原始計(jì)算:" + str)
str = Share.GetMd5String(str)
fmt.Println("計(jì)算結(jié)果:" + str)
if str == sign {
bArray, _ := json.Marshal(m_VarHH)
jsonString := string(bArray)
//調(diào)用VC回調(diào)函數(shù)
WebSocketCallBack(pSaveClass, req.RemoteAddr, 1, jsonString)
m_ReturnJson.BOK = true
m_ReturnJson.SMsg = "執(zhí)行正常"
NETReturnData(res, req, m_ReturnJson)
return
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "sign驗(yàn)證失敗"
fmt.Println("sign驗(yàn)證失敗")
}
NETReturnData(res, req, m_ReturnJson)
default:
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "未實(shí)現(xiàn)的函數(shù):" + FName
NETReturnData(res, req, m_ReturnJson)
}
default:
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "未實(shí)現(xiàn)應(yīng)用:" + ModeName + ",函數(shù):" + FName
NETReturnData(res, req, m_ReturnJson)
}
}
//頁(yè)面處理函數(shù)
func HomePage(res http.ResponseWriter, req *http.Request) {
fmt.Println("dom:", req.Host)
fmt.Println("url:", req.RequestURI)
url := req.RequestURI
nPos := strings.Index(url, "?")
if nPos != -1 {
url = Share.Substr(url, 0, nPos)
}
DefaultModeName := "CORESYS.SYS"
DefaultFuncName := "INDEX"
var MName, FName string
var urlArray []string = strings.Split(strings.ToUpper(url), "/")
nn := len(urlArray)
if nn >= 1 {
if nn == 1 {
MName = urlArray[0]
FName = DefaultFuncName
} else {
MName = urlArray[nn-2]
FName = urlArray[nn-1]
}
} else {
MName = DefaultModeName
FName = DefaultFuncName
}
if MName == "" {
MName = DefaultModeName
}
if FName == "" {
FName = DefaultFuncName
}
if FName == "FAVICON.ICO" {
b, err := ioutil.ReadFile(Share.GetCurrentDirectory() + "/web/favicon.ico")
if err != nil {
fmt.Print(err)
return
}
res.Header().Set("Content-Type", "image/x-icon")
res.Header().Set("Content-Length", strconv.Itoa(len(b)))
res.Write(b)
b = nil
return
}
ReturnType := 0
nIndex := strings.Index(FName, ".")
strLength := len([]byte(FName))
if nIndex != -1 {
DotName := Share.Substr(FName, nIndex+1, strLength-nIndex-1)
FName = Share.Substr(FName, 0, nIndex)
nIndex = strings.Index(FName, "_RAWJSON")
if nIndex != -1 {
ReturnType = 2
} else {
fmt.Println("DotName", DotName)
if DotName == "AJAX" {
ReturnType = 1
}
}
} else {
nIndex := strings.Index(FName, "_RAWJSON")
if nIndex != -1 {
ReturnType = 2
}
}
fmt.Println("ReturnType:", ReturnType)
if ReturnType == 1 {
var m_ReturnJson ReturnJson
fmt.Println("獲得數(shù)據(jù)")
m_VarHH := GetRequestParameHH(req)
isQQ := true
var m_PArray []string
var ok bool
ok, m_PArray = GetParameValues(m_VarHH, "appid", "msg", "qq", "sign", "qqnickname")
if ok {
} else {
ok, m_PArray = GetParameValues(m_VarHH, "appid", "msg", "weixin", "sign", "weixinnickname")
if !ok {
//處理數(shù)據(jù)
ActionAPI(res, req, MName, FName, m_VarHH)
return
}
isQQ = false
}
//bArray, _ := json.Marshal(m_Vars)
//fmt.Println(string(bArray))
if ok {
//fmt.Println("appid:" + m_PArray[0])
//fmt.Println("msg:" + m_PArray[1])
//fmt.Println("qq:" + m_PArray[2])
//fmt.Println("sign:" + m_PArray[3])
appid := m_PArray[0]
msg := m_PArray[1]
qq := m_PArray[2]
sign := m_PArray[3]
nickname := m_PArray[4]
appkeyString := ""
if isDBSave {
fmt.Println("采用數(shù)據(jù)庫(kù)存儲(chǔ)")
ok, m_Rows := m_baseDB.XNGetRecord(false, "select appkey from sys_apps where appid=?", appid)
if ok {
if len(m_Rows) == 0 {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "未能查詢到appid:" + appid
NETReturnData(res, req, m_ReturnJson)
return
}
appkey, ok := m_Rows[0]["appkey"]
if ok {
appkeyString = appkey.(string)
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "查詢appid:" + appid + "的appkey失敗"
NETReturnData(res, req, m_ReturnJson)
}
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "查詢appid:" + appid + "失敗"
NETReturnData(res, req, m_ReturnJson)
return
}
} else {
fmt.Println("采用INI存儲(chǔ)")
m_oneApp, ok := m_AppIDMAP[appid]
if ok {
appkeyString = m_oneApp.AppKey
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "查詢appid:" + appid + "失敗"
NETReturnData(res, req, m_ReturnJson)
return
}
}
str := ""
if isQQ {
str = "appid=" + m_PArray[0] + "&msg=" + msg + "&qq=" + qq + "&qqnickname=" + nickname + appkeyString
} else {
str = "appid=" + m_PArray[0] + "&msg=" + msg + "&weixin=" + qq + "&weixinnickname=" + nickname + appkeyString
}
fmt.Println("原始計(jì)算:" + str)
str = Share.GetMd5String(str)
fmt.Println("計(jì)算結(jié)果:" + str)
if str == sign {
m_ReturnJson.BOK = true
m_ReturnJson.SMsg = "OK"
fmt.Println("sign驗(yàn)證成功")
jsonString := ""
word := PickupHTML(msg)
/*
doc, err := goquery.NewDocument(msg)
if err != nil {
//log.Fatal(err)
}
doc.Find("img").Each(func(i int, s *goquery.Selection) {
src, _ := s.Attr("src")
fmt.Printf("img:%s\", src)
})
*/
imgs := PickupImages(msg)
if len(word) > 50 {
word = Share.Substr(word, 0, 50)
}
onClickURL := ""
FString := "onclick=\\"javascript:window.location.href='"
nPos := Share.StringIndex(msg, FString)
if nPos != -1 {
rightString := Share.Substr(msg, nPos+len(FString), -1)
fmt.Println("rightString:" + rightString)
FString = "';"
nPos = Share.StringIndex(rightString, FString)
if nPos != -1 {
onClickURL = Share.Substr(rightString, 0, nPos)
}
}
fmt.Println("onClickURL:" + onClickURL)
m_Data := make(map[string]interface{})
if isQQ {
m_Data["qq"] = qq
m_Data["datatype"] = "qq"
m_Data["nickname"] = nickname
} else {
m_Data["weixin"] = qq
m_Data["datatype"] = "weixin"
m_Data["nickname"] = nickname
}
m_Data["word"] = word
if imgs != nil {
m_Data["imgs"] = imgs
}
if onClickURL != "" {
m_Data["link"] = onClickURL
}
m_Data["rawtext"] = msg
m_Data["action"] = "sendmsg"
bArray, _ := json.Marshal(m_Data)
jsonString = string(bArray)
//回調(diào)通知VC處理
WebSocketCallBack(pSaveClass, req.RemoteAddr, 1, jsonString)
return
} else {
m_ReturnJson.BOK = false
m_ReturnJson.SMsg = "sign驗(yàn)證失敗"
fmt.Println("sign驗(yàn)證失敗")
}
NETReturnData(res, req, m_ReturnJson)
}
}
t, err := template.ParseFiles("web/index.html")
if err != nil {
fmt.Println(err)
return
}
err = WriteTemplateToHttpResponse(res, t)
if err != nil {
fmt.Println(err)
return
}
}
VC部分主要代碼
//初始化函數(shù)部分
void CWebRobotDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_RobotEngine.InitEngine();
char m_Data[500];
int nDataL=500;
GoString m_GoString=GoStringClass::CString2GoString("ws",(char *)m_Data,nDataL);
InitHttpWebSocket_return m_InitHttpWebSocket_return=InitHttpWebSocket(m_GoString, 12000, (DWORD)this,WSCallBack);
if((BOOL)m_InitHttpWebSocket_return.r0)
{
m_BT.EnableWindow(false);
}
}
其中m_RoboteEngine為實(shí)際操作QQ操作的類,主要代碼將在下面提供
VC的回調(diào)函數(shù)
void WSCallBack(int pClass,void *WSAddress,int NetEvent,void *pData,int nDataL)
{
CWebRobotDlg *pCWebRobotDlg=(CWebRobotDlg *)pClass;
printf("NetEvent:%d\\",NetEvent);
CString sText="";
if(nDataL>0)
{
char *pText=CChineseCodeLib::UTF_8ToGB2312((char *)pData, nDataL);
pCWebRobotDlg->AddMsg(pText);
sText.Format("%s",pText);
//printf("sText:\\%s\\",pText);
delete[]pText;
}
switch(NetEvent)
{
case 1:
{
HANDLE hJson=TextToJson((char *)(const char *)sText);
if(hJson!=NULL)
{
//真正處理消息函數(shù)
pCWebRobotDlg->ActionJson(hJson);
CloseJson(hJson);
}
//pCWebRobotDlg->ActionQQ();
}
break;
}
}
//處理函數(shù)
void CWebRobotDlg::ActionJson(HANDLE hJson)
{
CString sAction;
CString sName="datatype",sValue,sType,sDataType="";
CString NO,Word,Link,RawText,NickName;
CStringArray m_PICArray;
sName="action";
if(GetMFCJsonVar(hJson, sName,sAction,sType))
{
if(sAction=="sendmsg")
{
sName="datatype";
if(GetMFCJsonVar(hJson, sName,sValue,sType))
{
if(sValue=="qq")
{
sDataType=sValue;
GetMFCJsonVar(hJson, "qq",NO,sType);
}
else
{
if(sValue=="weixin")
{
sDataType="weixin";
GetMFCJsonVar(hJson, "weixin",NO,sType);
}
}
GetMFCJsonVar(hJson, "word",Word,sType);
GetMFCJsonVar(hJson, "rawtext",RawText,sType);
GetMFCJsonVar(hJson, "link",Link,sType);
CString FString="title=";
int nPos=Link.Find(FString);
if(nPos!=-1)
{
CString LString=Link.Mid(0,nPos);
CString RString=Link.Mid(nPos);
Link=LString+"&"+RString;
FString="linkto=";
nPos=Link.Find(FString);
if(nPos!=-1)
{
LString=Link.Mid(0,nPos);
RString=Link.Mid(nPos);
Link=LString+"&"+RString;
}
}
GetMFCJsonVar(hJson, "nickname",NickName,sType);
int nSize=GetJsonArraySize(hJson,"imgs");
CString PICString="";
for(int i=0;i<nSize;i++)
{
sName.Format("imgs[%d]",i);
GetMFCJsonVar(hJson, sName,sValue,sType);
m_PICArray.Add(sValue);
if(PICString!="")
{
PICString+=",";
}
PICString+=sValue;
}
CString TStr;
TStr.Format("DataType:%s,NO:%s,NickName:%s,Word:%s,Link:%s,ImgSize:%d,imgs:%s",(char *)(const char *)sDataType,(char *)(const char *)NO,(char *)(const char *)NickName,(char *)(const char *)Word,(char *)(const char *)Link,nSize,(char *)(const char *)PICString);
AddMsg((char *)(const char *)TStr);
if(sDataType=="qq" || sDataType=="weixin")
{
OneMsg *pOneMsg=new OneMsg();
pOneMsg->m_msgType=sDataType;
pOneMsg->m_textArray.Add(Word);
pOneMsg->m_textArray.Add(Link);
pOneMsg->m_linkUrl=Link;
for(int i=0;i<m_PICArray.GetSize();i++)
{
pOneMsg->m_imageArray.Add(m_PICArray.GetAt(i));
}
if(sDataType=="qq")
{
sprintf(pOneMsg->m_Robot.m_OneQQ.QQ,"%s",(char *)(const char *)NO);
sprintf(pOneMsg->m_Robot.m_OneQQ.QQName,"%s",(char *)(const char *)NickName);
}
else
{
if(sDataType=="weixin")
{
sprintf(pOneMsg->m_Robot.m_OneWX.WX,"%s",(char *)(const char *)NO);
sprintf(pOneMsg->m_Robot.m_OneWX.WXName,"%s",(char *)(const char *)NickName);
}
else
{
delete pOneMsg;
return;
}
}
//要處理的消息投遞給RobotEngine處理,RobotEngine的代碼后面提供
m_RobotEngine.AddOneMsg(pOneMsg);
}
}
}
else
{
printf("未實(shí)現(xiàn)的動(dòng)作:%s\\",(char *)(const char *)MFCJsonToText(hJson));
}
}
}
RobotEngine操作QQ發(fā)送消息核心代碼如下
RobotEngine::RobotEngine()
{
bInit=false;
}
RobotEngine::~RobotEngine()
{
if(bInit)
{
::DeleteCriticalSection(&m_SendWorkCS);
::DeleteCriticalSection(&m_RobotCS);
::DeleteCriticalSection(&m_GetMessageCS);
}
}
void RobotEngine::InitEngine()
{
if(bInit)
return;
bInit=true;
::InitializeCriticalSection(&m_SendWorkCS);
::InitializeCriticalSection(&m_RobotCS);
::InitializeCriticalSection(&m_GetMessageCS);
hSendStartEvent=::CreateEvent(NULL,true,false,NULL);
hGetMessageStartEvent=::CreateEvent(NULL,true,false,NULL);
hExitEvent=::CreateEvent(NULL,true,false,NULL);
CWinThread *pThread=AfxBeginThread(PostMessageThread,this);
pThread->m_bAutoDelete=true;
pThread=AfxBeginThread(GetMessageThread,this);
pThread->m_bAutoDelete=true;
LoadQQGroup();
}
UINT RobotEngine::PostMessageThread(LPVOID p)
{
RobotEngine *pRobotEngine=(RobotEngine*)p;
pRobotEngine->ActionPostMessage();
return 0;
}
UINT RobotEngine::GetMessageThread(LPVOID p)
{
RobotEngine *pRobotEngine=(RobotEngine*)p;
pRobotEngine->ActionGetMessage();
return 0;
}
void RobotEngine::ActionPostMessage()
{
HANDLE m_Events[2];
m_Events[0]=hSendStartEvent;
m_Events[1]=hExitEvent;
while(true)
{
DWORD nWait=WaitForMultipleObjects(2,m_Events,false,INFINITE);
switch(nWait)
{
case WAIT_OBJECT_0:
{
ActionOneMsg();
}
break;
case WAIT_OBJECT_0+1:
{
ClearPostWork();
return;
}
break;
default:
{
}
break;
}
}
}
void RobotEngine::ActionGetMessage()
{
HANDLE m_Events[2];
m_Events[0]=hGetMessageStartEvent;
m_Events[1]=hExitEvent;
while(true)
{
DWORD nWait=WaitForMultipleObjects(2,m_Events,false,INFINITE);
switch(nWait)
{
case WAIT_OBJECT_0:
{
ActionGetMsg();
}
break;
case WAIT_OBJECT_0+1:
{
ClearAllGetMsg();
return;
}
break;
default:
{
}
break;
}
}
}
//添加任務(wù)
void RobotEngine::AddOneMsg(OneMsg *pOneMsg)
{
::EnterCriticalSection(&m_SendWorkCS);
m_SendWorkPtr.AddTail(pOneMsg);
if(m_SendWorkPtr.GetCount()==1)
{
::SetEvent(hSendStartEvent);
}
::LeaveCriticalSection(&m_SendWorkCS);
}
void RobotEngine::ClearPostWork()
{
::EnterCriticalSection(&m_SendWorkCS);
for(int i=0;i<m_SendWorkPtr.GetCount();i++)
{
OneMsg *pOneMsg=(OneMsg *)m_SendWorkPtr.GetAt(m_SendWorkPtr.FindIndex(i));
delete pOneMsg;
}
m_SendWorkPtr.RemoveAll();
::LeaveCriticalSection(&m_SendWorkCS);
}
void RobotEngine::ActionOneMsg()
{
OneMsg *pOneMsg=NULL;
::EnterCriticalSection(&m_SendWorkCS);
if(m_SendWorkPtr.GetCount()>0)
{
pOneMsg=(OneMsg *)m_SendWorkPtr.GetHead();
m_SendWorkPtr.RemoveHead();
if(m_SendWorkPtr.GetCount()==0)
{
::ResetEvent(hSendStartEvent);
}
}
::LeaveCriticalSection(&m_SendWorkCS);
if(pOneMsg!=NULL)
{
::EnterCriticalSection(&m_RobotCS);
if(pOneMsg->m_msgType=="qq")
{
QQRobot::PostQQRichMessage((char *)pOneMsg->m_Robot.m_OneQQ.QQ,(char *)pOneMsg->m_Robot.m_OneQQ.QQName,pOneMsg->m_imageArray,pOneMsg->m_textArray);
}
else
{
if(pOneMsg->m_msgType=="weixin")
{
WXRobot::PostWXRichMessage((char *)pOneMsg->m_Robot.m_OneWX.WXName,pOneMsg->m_imageArray,pOneMsg->m_textArray);
}
else
{
if(pOneMsg->m_msgType=="qqgroupmember")
{
QQRobot::PostGoupMember(pOneMsg->m_Robot.m_OneGroupMember.GroupQQ,pOneMsg->m_Robot.m_OneGroupMember.GroupName,pOneMsg->m_Robot.m_OneGroupMember.ToQQ,pOneMsg->m_Robot.m_OneGroupMember.ToQQName,pOneMsg->m_imageArray,pOneMsg->m_textArray);
}
}
}
::LeaveCriticalSection(&m_RobotCS);
delete pOneMsg;
}
Sleep(2000);
}
//具體執(zhí)行一個(gè)消息
void RobotEngine::ActionOneGetMsg(OneGetMsg *pOneGetMsg)
{
::EnterCriticalSection(&m_RobotCS);
QQRobot::ActionQQGroupMessage(pOneGetMsg);
::LeaveCriticalSection(&m_RobotCS);
}
CString RobotEngine::GetDBString()
{
//Provider=SQLOLEDB.1;Connect Timeout=10;Persist Security Info=true;Initial Catalog=Ticket;Data Source=127.0.0.1;User ID=sa;Password=;
CString TStr,Path;
CString IP,DBName,UserName,PWD;
char tt[200];
GetModuleFileName(NULL,tt,200);
TStr.Format("%s",tt);
int nWei=TStr.ReverseFind('\\\\');
TStr=TStr.Mid(0,nWei+1);
Path=TStr+"web\\\\conf\\\\app.ini";
char Xiang[40];
sprintf(Xiang,"連接IP");
GetPrivateProfileString("WEB服務(wù)配置",Xiang,"",tt,200,Path);
IP.Format("%s",tt);
sprintf(Xiang,"庫(kù)名");
GetPrivateProfileString("WEB服務(wù)配置",Xiang,"",tt,200,Path);
DBName.Format("%s",tt);
sprintf(Xiang,"庫(kù)用戶名");
GetPrivateProfileString("WEB服務(wù)配置",Xiang,"",tt,200,Path);
UserName.Format("%s",tt);
sprintf(Xiang,"庫(kù)密碼");
GetPrivateProfileString("WEB服務(wù)配置",Xiang,"",tt,200,Path);
PWD.Format("%s",tt);
CString DBString="";
DBString.Format("Provider=SQLOLEDB.1;Connect Timeout=10;Persist Security Info=true;Initial Catalog=%s;Data Source=%s;User ID=%s;Password=%s",(char *)(const char *)DBName,(char *)(const char *)IP,(char *)(const char *)UserName,(char *)(const char *)PWD);
return DBString;
}
void RobotEngine::SetOneQQWord(CString GroupName, oneQQWord &m_oneQQWord)
{
oneQQWord m_oneQQWordT;
if(m_QQGroupWordMAP.Lookup(GroupName,m_oneQQWordT))
{
}
else
{
m_QQGroupWordMAP.SetAt(GroupName,m_oneQQWord);
}
}
BOOL RobotEngine::GetOneQQWord(CString GroupName, oneQQWord &m_oneQQWord)
{
return m_QQGroupWordMAP.Lookup(GroupName,m_oneQQWord);
}
void RobotEngine::AddOneGetMsg(OneGetMsg *pOneGetMsg)
{
::EnterCriticalSection(&m_GetMessageCS);
OneGetMsg *pTOneGetMsg=new OneGetMsg();
pTOneGetMsg->GroupName=pOneGetMsg->GroupName;
pTOneGetMsg->GroupQQ=pOneGetMsg->GroupQQ;
pTOneGetMsg->GroupMainKey=pOneGetMsg->GroupMainKey;
pTOneGetMsg->m_oneQQWordLast.QQName=pOneGetMsg->m_oneQQWordLast.QQName;
pTOneGetMsg->m_oneQQWordLast.Time=pOneGetMsg->m_oneQQWordLast.Time;
pTOneGetMsg->m_oneQQWordLast.Word=pOneGetMsg->m_oneQQWordLast.Word;
int i;
for(i=0;i<pOneGetMsg->QQArray.GetSize();i++)
{
pTOneGetMsg->QQArray.Add(pOneGetMsg->QQArray.GetAt(i));
}
for(i=0;i<pOneGetMsg->QQNameArray.GetSize();i++)
{
pTOneGetMsg->QQNameArray.Add(pOneGetMsg->QQNameArray.GetAt(i));
}
for(i=0;i<pOneGetMsg->NotifyUrlArray.GetSize();i++)
{
pTOneGetMsg->NotifyUrlArray.Add(pOneGetMsg->NotifyUrlArray.GetAt(i));
}
for(i=0;i<pOneGetMsg->AppIDArray.GetSize();i++)
{
pTOneGetMsg->AppIDArray.Add(pOneGetMsg->AppIDArray.GetAt(i));
}
for(i=0;i<pOneGetMsg->AppKeyArray.GetSize();i++)
{
pTOneGetMsg->AppKeyArray.Add(pOneGetMsg->AppKeyArray.GetAt(i));
}
m_GetMessagePtr.AddTail(pTOneGetMsg);
::SetEvent(hGetMessageStartEvent);
::LeaveCriticalSection(&m_GetMessageCS);
}
void RobotEngine::ClearAllGetMsg()
{
::EnterCriticalSection(&m_GetMessageCS);
for(int i=0;i<m_GetMessagePtr.GetCount();i++)
{
OneGetMsg *pOneGetMsg=(OneGetMsg *)m_GetMessagePtr.GetAt(m_GetMessagePtr.FindIndex(i));
delete pOneGetMsg;
}
m_GetMessagePtr.RemoveAll();
::LeaveCriticalSection(&m_GetMessageCS);
}
void RobotEngine::ActionGetMsg()
{
::EnterCriticalSection(&m_GetMessageCS);
for(int i=0;i<m_GetMessagePtr.GetCount();i++)
{
OneGetMsg *pOneGetMsg=(OneGetMsg *)m_GetMessagePtr.GetAt(m_GetMessagePtr.FindIndex(i));
ActionOneGetMsg(pOneGetMsg);
}
::LeaveCriticalSection(&m_GetMessageCS);
Sleep(10000);
}
void RobotEngine::LoadQQGroup()
{
CString TStr,Path;
CString IP,DBName,UserName,PWD;
char tt[200];
GetModuleFileName(NULL,tt,200);
TStr.Format("%s",tt);
int nWei=TStr.ReverseFind('\\\\');
TStr=TStr.Mid(0,nWei+1);
Path=TStr+"WebRobot.ini";
char Xiang[40],MainKey[40];
sprintf(Xiang,"group數(shù)量");
GetPrivateProfileString("群配置",Xiang,"",tt,200,Path);
TStr.Format("%s",tt);
int n=atoi(TStr);
CString GroupName,GroupQQ;
for(int i=0;i<n;i++)
{
sprintf(MainKey,"group_%d",i);
GetPrivateProfileString(MainKey,"groupname","",tt,200,Path);
GroupName.Format("%s",tt);
GetPrivateProfileString(MainKey,"groupqq","",tt,200,Path);
GroupQQ.Format("%s",tt);
GetPrivateProfileString(MainKey,"kfcnt","",tt,200,Path);
int kfcnt=atoi(tt);
if(GroupName!="" && GroupQQ!="" && kfcnt>0)
{
OneGetMsg m_OneGetMsg;
m_OneGetMsg.GroupMainKey.Format("%s",MainKey);
m_OneGetMsg.GroupName=GroupName;
m_OneGetMsg.GroupQQ=GroupQQ;
GetPrivateProfileString(MainKey,"lastqqname","",tt,200,Path);
m_OneGetMsg.m_oneQQWordLast.QQName.Format("%s",tt);
GetPrivateProfileString(MainKey,"lasttime","",tt,200,Path);
m_OneGetMsg.m_oneQQWordLast.Time.Format("%s",tt);
m_OneGetMsg.m_oneQQWordLast.Word="";
for(int j=0;j<kfcnt;j++)
{
CString QQ,QQName,NotifyUrl,AppID,AppKey;
sprintf(Xiang,"kfqq_%d",j);
GetPrivateProfileString(MainKey,Xiang,"",tt,200,Path);
QQ.Format("%s",tt);
sprintf(Xiang,"kfqqname_%d",j);
GetPrivateProfileString(MainKey,Xiang,"",tt,200,Path);
QQName.Format("%s",tt);
sprintf(Xiang,"kfnotifyurl_%d",j);
GetPrivateProfileString(MainKey,Xiang,"",tt,200,Path);
NotifyUrl.Format("%s",tt);
sprintf(Xiang,"kfappid_%d",j);
GetPrivateProfileString(MainKey,Xiang,"",tt,200,Path);
AppID.Format("%s",tt);
sprintf(Xiang,"kfappkey_%d",j);
GetPrivateProfileString(MainKey,Xiang,"",tt,200,Path);
AppKey.Format("%s",tt);
if(QQ!="" && QQName!="")
{
m_OneGetMsg.QQArray.Add(QQ);
m_OneGetMsg.QQNameArray.Add(QQName);
m_OneGetMsg.NotifyUrlArray.Add(NotifyUrl);
m_OneGetMsg.AppIDArray.Add(AppID);
m_OneGetMsg.AppKeyArray.Add(AppKey);
}
}
AddOneGetMsg(&m_OneGetMsg);
}
}
}
關(guān)于該應(yīng)用使用文件
文件結(jié)構(gòu)
conf下的配置文件app.ini
[WS服務(wù)配置]
端口=6100
節(jié)點(diǎn)名=node
HTTPS站點(diǎn)=false
HTTPS證書名=122
[WEB服務(wù)配置]
數(shù)據(jù)存儲(chǔ)方式=INI
庫(kù)類型=MSSQL
連接IP=127.0.0.1
庫(kù)名=robot
庫(kù)端口=5432
庫(kù)用戶名=hello
庫(kù)密碼=123
app數(shù)量=1
[app_0]
appid=appid
appname=QQ
appkey=appkey
notifyurl=
其中主要配置一般采用數(shù)據(jù)存儲(chǔ)采用INI方式以免安裝數(shù)據(jù)庫(kù)
接口app的數(shù)量也就是調(diào)用該接口的app的數(shù)量,及接口配置參數(shù)在[app]節(jié)點(diǎn)
在調(diào)用QQ消息發(fā)送時(shí)候需要
Post的JSON參數(shù)
{
"appid":"",
"msg":"消息內(nèi)容",
"qq":"接收消息QQ號(hào)",
"sign":"簽名",
"qqnickname":"QQ昵稱"
}
sign簽名為鍵排序后鍵名+鍵值各鍵之間用&拼接成串再加上appkey做MD5
PostJson地址為:http://服務(wù)地址:端口/qq.ajax
解決遠(yuǎn)程桌面解決斷開后UI交互問題
遠(yuǎn)程登錄服務(wù)器后,啟動(dòng)主程序
執(zhí)行以下命令
query session
查詢遠(yuǎn)程連接編號(hào)一般為 #0
然后執(zhí)行
tscon rdp-tcp#0 /dest:console
給機(jī)器人分配一個(gè)遠(yuǎn)程賬戶,登錄進(jìn)去后執(zhí)行連接到本地
日常維護(hù)的用另一個(gè)遠(yuǎn)程賬戶
以上就是關(guān)于pos機(jī)api接口,Go集合VC實(shí)現(xiàn)簡(jiǎn)單的QQ消息派發(fā)接口的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)api接口的知識(shí),希望能夠幫助到大家!









