pos機(jī)api接口

 新聞資訊2  |   2023-07-09 14:45  |  投稿人:pos機(jī)之家

網(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í),讓我們一起來看下吧!

本文目錄一覽:

1、pos機(jī)api接口

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í),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://m.nxzs9ef.cn/newsone/82019.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。