博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[VC6 console]调用API获取手机归属地
阅读量:5757 次
发布时间:2019-06-18

本文共 4435 字,大约阅读时间需要 14 分钟。

      为了完成作业,就偷个懒糊了个获取手机归属地的程序,[VC6 console]调用API获取手机归属地 - sunnysab - 奋斗。我原本写的是MFC版本的,但是由于MFC的代码不是很通用,加上我没有学MFC的时候看别人MFC代码只能干瞪眼,看不懂,所以便改成控制台版本的了。但这API还害得我找了老半天,不是功能少就是根本用不了(例如youdao)文中所用的API地址是 ,有两个参数:

 

m 手机号,由11位数字组成 
output 可以为xml或json

      注:浏览器显示可能有些问题,毕竟<Mobile>等标签浏览器是无法识别的,可以在“查看源文件”中查看

 

 

      我使用的是xml格式。json解析可以用jsoncpp,就是不知道怎么在VC6下使用,若您了解,还请你回复讲解。

      思路很简单,URLDownLoadToFile()下载文件,再写个函数解析,好,开始!

// 头文件#include 
#include
#include
#pragma comment( lib, "urlmon.lib" )

 

// 为了复制粘贴方便,写了2个宏#define  GETEND( str ) (SreachStr( MobileInfo, str ) + strlen( str ))#define  GETSTART( str ) (SreachStr( MobileInfo, str ) - 1)

 

// 函数Utf8_to_ascii,API大多都是UTF8格式的,要用此函数转换成asciichar *Utf8_to_ascii( char utf8[] ){ int     len   = MultiByteToWideChar( CP_UTF8, 0, utf8, -1, NULL, 0); wchar_t *wstr = new wchar_t[len+1]; memset( wstr, 0, len + 1); MultiByteToWideChar( CP_UTF8, 0, utf8, -1, wstr, len); len = WideCharToMultiByte( CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); char *str = new char[len+1]; memset(str, 0, len+1); WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL); if( wstr ) {  delete[] wstr; } return str;}

 

// 函数SreachStr,寻找API中间<...>...
的数据int SreachStr( const char str1[], const char str2[] ){ int i = 0; int j = 0; int len1 = strlen( str1 ); int len2 = strlen( str2 ); for( i = 0; i < len1; i++ ) { bool Findit = true; for( j = i; j < len2 + i; j++ ) { if( str2[j-i] != str1[j] ) { Findit = false; } } if( Findit ) { return i; } } return -1;}

 

主函数似乎太长了点……
int main( int argc, char *argv[] ){    char   Mobilenum[11];    HRESULT     hDownToFile;   // 文件下载句柄    HANDLE      hMobileFile;   // 手机信息句柄    char        chUrl[100];    unsigned long  nReadSize = 0;    memset( Mobilenum, 0, 11 );    memset( chUrl, 0, 100 );    scanf( "%s", Mobilenum );        strcpy( chUrl, "http://api.showji.com/Locating/www.showji.co.m.aspx?m=");    strcat( chUrl, Mobilenum );    strcat( chUrl, "&output=xml" );    hDownToFile = URLDownloadToFile( 0,  chUrl, TEXT("Temp File.tmp"), NULL, NULL );    if( hDownToFile != S_OK )    {        printf( "下载失败!\n" );        return 0;    }    hMobileFile = CreateFile( "Temp File.tmp", // 文件名                              GENERIC_READ,      // 读文件操作                              NULL,                              NULL,                              OPEN_EXISTING,     // 打开文件                              FILE_FLAG_DELETE_ON_CLOSE,  // 作为临时文件                              NULL);    if ( hMobileFile == INVALID_HANDLE_VALUE )    {        printf( "打开文件失败!\n" );        return 0;    }    char      ReadData_UTF8[400];    char      MobileInfo[400];    memset( ReadData_UTF8, 0, 400);    if ( ReadFile( hMobileFile, ReadData_UTF8, 400, &nReadSize, NULL ) == FALSE )    {        printf( "读取文件失败!\n%d", GetLastError() );        return 0;    }    strcpy( MobileInfo, Utf8_to_ascii(ReadData_UTF8) );    CloseHandle( hMobileFile );    /************************** 读取工作结束 *************************/    /************************** 开始解析数据 *************************/    char  temp[30];    int   i = 0;    int   start = GETEND( "
" ); int end = GETSTART( "
" ); memset( temp, 0, 30); for( i = start; i <= end; i ++ ) { temp[i - start] = MobileInfo[i]; } if( !strcmp( temp, "False") ) { printf( "号码不存在或暂无数据!\n" ); return 0; } start = GETEND( "
" ); end = GETSTART( "
" ); memset( temp, 0, 30); for( i = start; i <= end; i ++ ) { temp[i - start] = MobileInfo[i]; } printf( "所 在 地: %s\n", temp ); start = GETEND( "
" ); end = GETSTART( "
" ); memset( temp, 0, 30); for( i = start; i <= end; i ++ ) { temp[i - start] = MobileInfo[i]; } printf( "区 号: %s\n", temp ); start = GETEND( "
" ); end = GETSTART( "
" ); memset( temp, 0, 30); for( i = start; i <= end; i ++ ) { temp[i - start] = MobileInfo[i]; } printf( "邮政编码: %s\n", temp ); start = GETEND( "
" ); end = GETSTART( "
" ); memset( temp, 0, 30); for( i = start; i <= end; i ++ ) { temp[i - start] = MobileInfo[i]; } printf( "运 营 商: %s\n", temp ); start = GETEND( "
" ); end = GETSTART( "
" ); memset( temp, 0, 30); for( i = start; i <= end; i ++ ) { temp[i - start] = MobileInfo[i]; } printf( "省 份: %s\n", temp ); return 0;}

 

总算完成了。运行界面如图:

 

源码下载地址:

 

你可能感兴趣的文章
常用排序算法总结
查看>>
使用sstream读取字符串中的数字(c++)
查看>>
如何提高还在用window系统的编码硬效率
查看>>
树莓派下实现ngrok自启动
查看>>
javascript静态类型检测工具—Flow
查看>>
MachineLearning-Sklearn——环境搭建
查看>>
node学习之路(二)—— Node.js 连接 MongoDB
查看>>
Goroutine是如何工作的?
查看>>
《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略
查看>>
用grunt搭建自动化的web前端开发环境-完整教程
查看>>
研究人员发现:基于文本的AI模型容易受到改述攻击
查看>>
TriggerMesh开源用于多云环境的Knative Event Sources
查看>>
GitLab联合DigitalOcean为开源社区提供GitLab CI免费托管
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>
区块链现状:从谨慎和批判性思维看待它(第二部分)
查看>>
苹果公司透露Siri新发音引擎的内部原理
查看>>
GCM 3.0采用类似方式向Android、iOS和Chrome发送消息
查看>>
如何成为一家敏捷银行
查看>>
MongoDB主动撤回SSPL的开源许可申请
查看>>
Oracle在JavaOne上宣布Java EE 8将会延期至2017年底
查看>>