老瓶装新酒 - C#调用WM手机发送短信(源码)

简介:

一些系统,需要能够发送短信,量很小,平均每日10条。
运营商平台太贵,白名单很严格,小额只能发省内;
各短信平台有各种限制,大事件前后会关闭;
飞信以前可以用WAP发,但是现在多了验证码,搞不定了;
短信猫买来还得写控制程序,价钱和时间上……


手上有两部废弃的WM手机,没有故障,只是老旧不好用!


有一个WM软件(后面有下载),它在WM手机上开启一个Http服务器,使得我们可以在PC上通过浏览器直接访问!

AP{_O6V~()@5J%NKJA$]5UC

S{9YYV(0SD)`I]`{)_PLD77

有收发短信的功能!
把手机WiFi性能跳到最大,关闭每x分钟限制自动关闭;软件设置自动开启服务,关闭“运行时防止休眠”(它设计上有BUG,这个会导致服务10分钟就关闭),拉到启动目录设为自动启动。

OK!就是它了,我们写个程序包装一下,伪造为Web操作收发短信!


主要代码如下:

View Code
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using NewLife;
using NewLife.Linq;
using NewLife.Log;
using NewLife.Web;

namespace WMSms
{
    /// <summary>手机类</summary>
    class Mobile : DisposeBase
    {
        #region 属性
        private String _Address;
        /// <summary>地址</summary>
        public String Address { get { return _Address; } set { _Address = value; } }

        private Boolean _Logined;
        /// <summary>是否已登录</summary>
        public Boolean Logined { get { return _Logined; } set { _Logined = value; } }
        #endregion

        #region 构造
        public Mobile(String address)
        {
            Address = address;
        }

        protected override void OnDispose(bool disposing)
        {
            base.OnDispose(disposing);

            if (client != null) client.Dispose();
        }
        #endregion

        #region 通讯基础
        private WebClientX client;

        void EnsureClient()
        {
            if (client != null) return;

            client = new WebClientX(true, true);
            client.Encoding = Encoding.UTF8;

            ServicePointManager.Expect100Continue = false;
        }

        String Get(String url)
        {
            EnsureClient();

            //return client.DownloadString(url);
            var bts = client.DownloadData(url);
            return Encoding.UTF8.GetString(bts);
        }

        String Post(String url, String data)
        {
            EnsureClient();

            client.Headers["Referer"] = url;
            client.Headers["Content-Type"] = "application/x-www-form-urlencoded";
            //return client.UploadString(url, data);
            var bts = Encoding.UTF8.GetBytes(data);
            bts = client.UploadData(url, bts);
            return Encoding.UTF8.GetString(bts);
        }

        String Post(String url, IDictionary<String, Object> data)
        {
            if (data == null) return Post(url, "");

            var sb = new StringBuilder();
            foreach (var item in data)
            {
                if (sb.Length > 0) sb.Append("&");

                if (item.Value != null)
                    sb.AppendFormat("{0}={1}", item.Key, HttpUtility.UrlEncode("" + item.Value));
                else
                    sb.AppendFormat("{0}=", item.Key);
            }

            return Post(url, sb.ToString());
        }
        #endregion

        #region 方法
        public Boolean Login(String pass)
        {
            if (Logined) return true;

            var url = String.Format("http://{0}/authent/?returnurl=%2Ffs%2F", Address);
            var html = Get(url);

            url = String.Format("http://{0}/authent/?returnurl=%2Ffs%2F", Address);

            var dic = new Dictionary<String, Object>();
            dic.Add("user", "Admin");
            dic.Add("pwd", pass);

            html = Post(url, dic);

            var rs = !html.IsNullOrWhiteSpace() && html.Contains("form");

            Logined = rs;

            return rs;
        }

        public Boolean SendMessage(String number, String content)
        {
            var url = String.Format("http://{0}/messaging/?page=newmessage", Address);

            var dic = new Dictionary<String, Object>();
            dic.Add("RequestDeliveryReport", "chk");
            dic.Add("recipient", number);
            dic.Add("recipientName", null);
            dic.Add("smsbody", content);

            var html = Post(url, dic);

            return !html.IsNullOrWhiteSpace() && html.Contains("已发信息");
        }

        public Boolean Ping()
        {
            if (!Logined) return false;

            try
            {
                var url = String.Format("http://{0}/fs/", Address);
                var html = Get(url);

                if (html.IsNullOrWhiteSpace()) return false;

                // 如果回到登录页面,则标记为未登录
                if (html.Contains("authent"))
                {
                    Logined = false;
                    return false;
                }

                return html.Contains("My Device");
            }
            catch (Exception ex)
            {
                XTrace.WriteException(ex);
                return false;
            }
        }
        #endregion

        #region 接收短信
        public List<Message> ReceiveUnReaded()
        {
            var list = Receive(0);
            if (list == null) return null;

            list = list.Where(m => !m.Readed).ToList();
            var i = 1;
            var ls = list;
            while (ls.Count >= 10 && !ls[ls.Count - 1].Readed)
            {
                ls = Receive(i++);
                if (ls == null || ls.Count < 1) break;

                ls = ls.Where(m => !m.Readed).ToList();
                list.AddRange(ls);

                if (list.Count >= 100) break;
            }

            return list;
        }

        public List<Message> ReceiveFromTime(DateTime start)
        {
            var list = Receive(0);
            if (list == null) return null;

            list = list.Where(m => m.Time > start).ToList();
            var i = 1;
            var ls = list;
            while (ls.Count >= 10 && ls[ls.Count - 1].Time > start)
            {
                ls = Receive(i++);
                if (ls == null || ls.Count < 1) break;

                ls = ls.Where(m => m.Time > start).ToList();
                list.AddRange(ls);

                if (list.Count >= 100) break;
            }

            return list;
        }

        static Regex _regMsg = new Regex("<div class=\"([^\"]*)\"><span class=\"msgDesc\">从 :</span>\\s*([^<]*?)\\s*-\\s*<a href=\"\\?page=newmessage&recipient=([^&\"]*)[^\"]*\">答复</a><br/><span class=\"msgDesc\">已收到 :</span>\\s*([^<]*?)\\s*<br/>\\s*([^<]*?)\\s*</div>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        public List<Message> Receive(Int32 page)
        {
            if (!Logined) return null;

            var url = String.Format("http://{0}/messaging/", Address);
            if (page > 1) url += "?page=" + page;
            var html = Get(url);
            if (html.IsNullOrWhiteSpace()) return null;

            var list = new List<Message>();
            foreach (Match m in _regMsg.Matches(html))
            {
                var msg = new Message();
                msg.Readed = "readMsg".EqualIgnoreCase(m.Groups[1].Value);

                // 名字
                var name = m.Groups[2].Value.Trim();
                if (!name.IsNullOrWhiteSpace())
                {
                    name = HttpUtility.HtmlDecode(name);

                    var p = name.IndexOf("(");
                    if (p > 0) name = name.Substring(0, p).Trim();
                    msg.Name = name;
                }

                // 号码
                var num = m.Groups[3].Value.Trim();
                if (!num.IsNullOrWhiteSpace())
                {
                    num = HttpUtility.UrlDecode(num);
                    if (num.StartsWith("+86")) num = num.Substring(3);
                    msg.Number = num;
                }

                // 时间
                var dt = m.Groups[4].Value.Trim();
                if (!dt.IsNullOrWhiteSpace())
                {
                    dt = HttpUtility.HtmlDecode(dt);

                    var p = dt.IndexOf("(");
                    if (p > 0) dt = dt.Substring(0, p).Trim();

                    DateTime d;
                    if (DateTime.TryParse(dt, out d))
                        msg.Time = d;
                    else if (DateTime.TryParseExact(dt, "MM/dd/yy dddd HH:mm:ss", null, DateTimeStyles.None, out d))
                        msg.Time = d;
                }

                // 内容
                var txt = m.Groups[5].Value.Trim();
                if (!txt.IsNullOrWhiteSpace())
                {
                    msg.Content = HttpUtility.HtmlDecode(txt);
                }

                list.Add(msg);
            }

            return list;
        }

        public class Message
        {
            private String _Number;
            /// <summary>号码</summary>
            public String Number { get { return _Number; } set { _Number = value; } }

            private String _Name;
            /// <summary>名称</summary>
            public String Name { get { return _Name; } set { _Name = value; } }

            private String _Content;
            /// <summary>内容</summary>
            public String Content { get { return _Content; } set { _Content = value; } }

            private DateTime _Time;
            /// <summary>时间</summary>
            public DateTime Time { get { return _Time; } set { _Time = value; } }

            private Boolean _Readed;
            /// <summary>是否已读</summary>
            public Boolean Readed { get { return _Readed; } set { _Readed = value; } }
        }
        #endregion
    }
}

 

 

 

刚下去小店买了一张移动动感地带的卡,50块办卡返50,分5月返还每月10元,套餐每月20元包400条短信,实际上,后面每个月只需要交10元即可!

 

配置一下路由器,把WM手机的Http端口映射到公网,可供远程应用系统直接调用!

现在很多可用的二手WM手机只需要一百多块钱即可买到。

这个方案跟短信猫不相上下,(短信猫成品三百多块),也算是多一种选择吧!

 

WM软件:WiFi.rar

源代码:WMSmsSrc.rar

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
分类: 物联网

本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/archive/2012/11/02/WMSms.html,如需转载请自行联系原作者
目录
相关文章
|
11天前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
24 5
|
4月前
|
存储 C# 图形学
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
51 1
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
46 1
|
8天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
25天前
|
安全 JavaScript 前端开发
C#医院手麻系统源码,手术麻醉管理系统源码
手术麻醉管理系统贯穿患者入院至出院全程,整合术前术后流程,如手术排班、麻醉计划、术中监护及术后恢复。采用C#.net6.0、Vue、Ant-Design等技术,与sqlserver2019数据库结合。系统提供麻醉记录、手术安全核查、费用管理等功能,确保信息数字化和流程规范化。通过自动化记录和数据分析,增强手术安全,优化资源分配,并支持医疗质控与研究。
C#医院手麻系统源码,手术麻醉管理系统源码
|
26天前
|
存储 监控 安全
C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?
C#编写的大型医院手术麻醉系统旨在满足四大核心需求:智慧医院建设,要求实时患者信息共享与监控;医院等级评级,强调安全评估与术后管理;电子病历评级,规定手术预约、麻醉信息的标准化;科室需求,包括系统互联、流程信息化、数据追溯、操作简便、文书完整、快速响应、生命体征动态采集及质量控制。系统提升手麻工作的效率与安全性,确保手术顺利进行。
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
23 1
|
2月前
|
前端开发 JavaScript BI
C#区域医院云LIS信息管理系统源码
区域医院云LIS可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验。
33 2
|
2月前
|
开发框架 前端开发 NoSQL
C#医院区域云LIS系统源码
LIS操作流程标本流转----标本核收----标本上机检验----费用汇总----报告审核----报告发布----报告打印等基础流程
38 3
|
3月前
|
运维 数据挖掘 C#
C#大型LIS检验信息系统项目源码
LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地看到患者的检验结果。
31 0