精华内容
下载资源
问答
  • 至于为什么想删QQ动态,只是不想老是看到那年今日那些曾经的很幼稚的话,动态又多(虽然这几年已经不用QQ了),用手太费劲,就想写个脚本自动处理了。 要想删除所有动态,我需要做2件事: 1. 获取所有的动态信息...

    讲真的,我在写这个脚本的时候,我还没把python的基本语法都了解了。我只能说,语言不重要,好用就行。。。

    至于为什么想删QQ动态,只是不想老是看到那年今日那些曾经发的很幼稚的话,动态又多(虽然这几年已经不用QQ了),用手太费劲,就想写个脚本自动处理了。

    要想删除所有动态,我需要做2件事:

    1. 获取所有的动态信息

    2. 获取删除的url,遍历已经获取的所有动态,然后全部删除了就行。

    另外,这有一个大前题:需要先获取到会话信息。这个简单,毕竟是自己的QQ,直接登录然后,浏览器上什么不都有了。

    当然,这说起来简单,做起来嘛。。。。。。。也挺简单。

    我本来是想用shell解决的,后来抓下动态信息,发现是个json。我想了想,觉得python应该好用点(赶紧先用俩小时研究下python语法)。

    下面开始了:

    1. 登录QQ空间,点击说说,首先要找到可以获取动态信息列表的url。这里我就直说我的分析结果了,在动态下面有个页码,点击的时候的url就是,下面给个示例:

    https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin=763795151&inCharset=utf-8&outCharset=utf-8&hostUin=763795151&notice=0&sort=0&pos=840&num=20&cgi_host=http%3A%2F%2Ftaotao.qq.com%2Fcgi-bin%2Femotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk=635656033&qzonetoken=8f1208fd31ba56f14fb6f71f498501c179fde08e0a6866589e12672dc8fe8c2af00b924c63f35c

    大概就是上面这个样子,里面有两个参数,pos:从第几条开始,num:获取几条。需要的时候调整这两个参数的值即可。

    然后,把这个url在浏览器上发个请求,我用的谷歌。然后把请求头、cookie等信息都拿出来。根据pos和num的值就可以获取到动态信息。返回的结果是一个字符串,掐头去尾就剩中间的部分就是个Json字符串了。我已经删除完了,也不给示例了,我直接描述这个字符串了,这个json串中有个字段msglist是个列表,可能为空,在不空的时候,每个值有个字段是tid,tid的值就是我们删除这条动态的时候需要用的一个查询参数。把每条动态的tid保存起来,后面遍历删除即可。

    2. 获取删除的url。这个操作很简单,删除一个,然后把删除的请求信息拿出来就行(查看浏览器)。这个是个post方法,拿到删除时候用到的url、请求头、cookie、请求参数。然后配置好。

    3. 遍历1中获取的所有tid,然后设置每个tid为要删除的请求中参数,依次删除即可。

    倒是不复杂,没多少技术含量。下面贴下我的实现,毕竟第一次用python,也不知道姿势对不对。

    代码:

    #! /usr/bin/python
    
    import requests
    import re
    import json
    
    #总共要删除的动态数
    total=840
    limit=10
    pages=total/limit
    start_pos=2
    tids=[]
    #文中说的掐头去尾就是json,所以这里用个正则处理
    pattern=re.compile(r'^_Callback\((.*)\);$')
    #获取所有动态的tid
    cookie="换成自己浏览器中的cookie信息"
    #请求头
    request_headers={'authority':'h5.qzone.qq.com','method':'GET','path':'/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin=763795151&inCharset=utf-8&outCharset=utf-8&hostUin=763795151&notice=0&sort=0&pos=820&num=40&cgi_host=http%3A%2F%2Ftaotao.qq.com%2Fcgi-bin%2Femotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk=1874324779&qzonetoken=98cd2ff9067f620f90a72cbe07da56012b4593659ebbf1deba0b350e82d53be364cd48d038e7ca','scheme':'https','accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3','accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7','cache-control':'max-age=0','cookie':cookie, 'upgrade-insecure-requests':'1'}
    def getTids(say_list_url):
        res=requests.get(say_list_url, headers=request_headers)
        text=pattern.findall(res.text)[0]
        resolveTid(text)
        print "tid len: %d" % (len(tids))
        
    def resolveTid(text):
        jsonObj=json.loads(text)
        if  not jsonObj.has_key('msglist') :
            print text
            return False
        msglist=jsonObj['msglist']
        if  msglist is None :
            return False
        for msg in msglist:
            print "tid: %s" % (msg['tid'])
            tids.append(msg['tid'])
    
    for page in range(pages):
        num=limit*page
        #动态设置pos和num值来获取所有的说说信息
        say_list_url="https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin=763795151&inCharset=utf-8&outCharset=utf-8&hostUin=763795151&notice=0&sort=0&pos=%d&num=%d" % (start_pos+num, limit) + "&cgi_host=http%3A%2F%2Ftaotao.qq.com%2Fcgi-bin%2Femotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk=1168850316&qzonetoken=87520ec2a71a9f349d23d7e462ffdef0bc3075786bc42114239de62af56e92ca85ccb2eb098144" 
        getTids(say_list_url)
    
    print "total: %d" % (len(tids))
    print "start delete..."
    
    #删除说说的url,换成自己的
    delete_url="https://user.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_delete_v6?qzonetoken=fc557d5f5542fbb951479b8e8b2f1a0f163db952eb44cef275261b76b758edeb51c34834c16f80&g_tk=597814207"
    delete_cookie="换成自己的浏览器的cookie"
    #换成自己的
    delete_headers={'authority':'user.qzone.qq.com','method':'POST','path':'/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_delete_v6?qzonetoken=9a40f79cdd9908ccbd41466b3b2276314f155525357ae4fb8a7d90093f6379e5144d31eefeabc6&g_tk=597814207','scheme':'https','accept':'*/*','accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7','content-length':'178','content-type':'application/x-www-form-urlencoded;charset=UTF-8','origin':'https://user.qzone.qq.com','referer':'https://user.qzone.qq.com/763795151/311', 'cookie': delete_cookie, 'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36'}
    body={'hostuin':'763795151','t1_source':'1','code_version':'1','format':'fs','qzreferrer':'https://user.qzone.qq.com/763795151/311','tid':''}
    for tid in tids:
        body['tid']=tid
        print body
        dr=requests.post(delete_url, data=body, headers=delete_headers)
        print dr
    

    如果会话信息太久失效了,就重新登录更新下,做web都明白这个。如果出现403,那就是配置不正确,确认请求头、cookie、url都不要复制错了。

    这算是我用python写的第一个程序了。

    展开全文
  • 前几天有网友问我,在游戏找call的时候遇到了动态地址的call,无法下手了, ...这里,我那QQ斗地主角色版 为例 来讲一下,如何去找到基址会动态变化的call的方法,简而言之就是怎样可以有效的在每次游戏启动

    真是无语了csdn,你得图片就这么难弄么!!!!!!!,请参考:https://my.oschina.net/junehappylove/blog/816416

    前几天有网友问我,在游戏找call的时候遇到了动态地址的call,无法下手了,

    什么情况呢?就是每次启动游戏,call的地址都会变化。。。。。。。。。。

    这样,这个call就没发使用了,注意原因就是 基址重定位 的问题,想深入了解的同学,请自行百度”PE结构“去吧!

    这里,我那QQ斗地主角色版 为例 来讲一下,如何去找到基址会动态变化的call的方法,简而言之就是怎样可以有效的在每次游戏启动都能准确的获取到游戏的功能call的准确地址。

    下面均以为例,

    另外本帖只做技术研究请各位勿做他用!!!

    找call的方法就不多说了,如果你连call都找不到的话,就不用往下看了。

    -------------

    (我是以经找好了,这个游戏喊话下send断点不好使,但是他们的程序哥哥在开发时候不太认真,打印了好多调试信息,所以,,,,你们懂的如何查找了吧)

    。。。

    1207366E  |.  45                 INC EBP

    1207366F  |.  50                 PUSH EAX                          /Arg2

    12073670  |.  55                 PUSH EBP                          |Arg1

    12073671  |.  8BCE               MOV ECX,ESI                   |

    12073673  |.  E8 A8000000        CALL 12073720        \CUQG_ocx.12073720, 真正的游戏喊话call

    。。。

    我们找到的真正喊话call,如下:

           mov eax,0AF20000     ; 申请一块内存地址,放入“123”的喊话内容

           mov ebp,4                  ; 喊话的长度是4

           mov esi,105DCDD4     ; 这次游戏的平衡值

          PUSH EAX          ; 喊话内容

          PUSH EBP          ; 喊话内容长度+1

          MOV ECX,ESI  ; ecx平衡地址

          CALL 12073720     ; 这次游戏的call地址值(动态变化的,因为这个方法位于dll中,基址被重定位)

    特征码:8B 54 24 10 6A 00 8D 4C 24 14 C6 44 24 50 01 8B 6A F8   找下面第2个call

    然后测试一下,发现可以啦!


     但是你也看到了,call的地址 两次游戏的启动,明显变化了,这是不符合我们预期想要的call结果

    不止是call的变化了,ecx平衡值也是变化的(多试几次就会发现)

    ==========================================================

           动态call地址变化,如何解决?

           思路这个游戏主进程是:ddzrpg.exe,然后喊话的call位于模块:CUQG.ocx中,

                  所以可以先找到 喊话call,单独位于CUQG.ocx的位置:addr1;

                        然后再在游戏进程中去获取模块CUQG.ocx的加载地址:addr2 ;

                  那么,最后这个call的地址就是 addr = addr1+addr2 (理解这一点是非常重要的)

          解决:

                思路有了就开始动手解决,先找单独CUQG.ocx中的 call地址;其次找取他位于游戏中的地址;

           1.找CUQG.ocx中的call地址,方法:

                  OD直接附加CUQG.ocx(ocx也是属于dll动态链接库范畴的)

                  先把这个文件从游戏目录中拿出来:  

      

           用特征码搜索, 最后得到的地址是:10003720   ,我们所需要的有效地址实际上就是一个偏移值: 0x00003720  

         (上面这个步骤其实不用找也无所谓的,很明显就是 0x3720偏移)

            2.找模块CUQG.ocx加载到游戏里面的地址,方法:

                 这个地址是因为游戏先把主程序加载到 0x04000000,然后再加载CUQG.ocx,所以只能被重定位了,这里就需要编程去取模块地址(句柄)了。

                    用到的一个函数是:GetModuleHandle( )        ,百度一下:

            函数的声明

                    HMODULE GetModuleHandle(LPCTSTR lpModuleName);

            功能说明

                    获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的进程空间中。

            参数说明

                    lpModuleName 模块名称

            返回值

                    如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息

            注意

                    前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。常用模块映射函数:LoadLibrary(..)。

         这第二步是最重要的,我只给大家讲好思路,剩下的就是你们去编程了!就是去拿到 CUQG.ocx模块在游戏进程中句柄即可。。。。

    =======================================

            以上两步就可以找到喊话call的地址了!!!!  本次游戏中的句柄是 120F0000 

    =======================================

    另外还有一个重要的ecx平衡值需要解决

            [105DCDD4]=1212 6F48

            [105DBBBC]=1212 6F48

            [105DBEB4]=1212 6F48

            这是一个很头疼的问题,目前没有什么好的方法,可以发现这个地址对应的内容值是有规律的:1212 6F48(后四位固定,前四位是动态变化的)

         这里类比一下找call的动态地址,很容易发现一个规律 12120000 - 00030000 = 120F0000 正好是找call时后的找的CUQG.ocx模块的载入地址(句柄)

    这里注意有个 00030000h 的 差值,发现这个规律也就好继续往下做了

            那么就直接内存搜索:12126F48,就会得到 ecx 平衡值;

            我能力有限,关于找平衡值的解决的方法就是整个搜索内存了,方法很笨!也希望有大神指点一二。

              (我尝试过使用OD跟踪,和CE跟踪这个平衡值,可惜没有找到)

    =====================

    最后的效果如下:


    上面是用易语言写的测试程序,如需程序源码,请 有偿 联系作者吧!<^-^>

     

    再次重申,请勿用学的的知识去做非法勾当!!!

    展开全文
  • 摄像DIY功能包含大头贴,摇头娃娃,拍制真人动态QQ表情三大功能。其实大头贴中还包含漫画文字和开心恶搞功能。有趣又实用! (1)摇头娃娃 摇头娃娃是把人物头部抠下后套用在素材“身体”上,很新颖搞笑。不会PS没...
  • 90后的青春,定格在被淡忘的QQ空间里 QQ空间,这个曾经陪我们从童年到少年再到成年,从2G时代再到如今的4G末,占据了我们太多的青春回忆,如今好友空间动态更新的不在像...,看到自己好几年前动态,说的傻话,...

    90后的青春,定格在被淡忘的QQ空间里

    QQ空间,这个曾经陪我们从童年到少年再到成年,从2G时代再到如今的4G末,占据了我们太多的青春回忆,如今好友空间动态更新的不在像从前那样频繁。依稀记得当年的好友买卖,抢车位再或者情侣空间,现在想想那时候真的很幼稚,那就是我们傻逼的童年,什么互踩,火星文,跑堂见证了我们无忧无虑的童年。

    有时候看看QQ推送的"那年今日",看到自己好几年前发的动态,说的傻话,自己都怕了自己。有时候看到好朋友几年前的动态,不由笑骂道,这孙子,怎么这么2! 即使现在不怎么用QQ了,有时候看看曾经发的说说还有空间的留言。即使让我再尴尬也不舍得删,因为那都是青春满满的回忆。

    空间留言上千条,说说也比较多,一页一页的翻比较麻烦。索性就把这些数据都下载到本地。同理我们也可以导出全部联系人的说说和留言板。

     

    Selenium

    由于访问好友留言板需要登录,为了方便起见我们使用Web应用程序测试的Selenium工具。该工具可以用于单元测试,集成测试,系统测试等等。它可以像真正的用户一样去操作浏览器等,支持Mozilla Firefox、Google Chrome、Safari、Opera、IE等等浏览器。

    使用这个工具之前我们需要安装selenium库和下载相应浏览器的驱动。然后通过分析QQ空间登录界面我们发现默认是扫码登录,因此需要切换成账号密码登录。

     

    通过分析html标签属性,我们发现 id="switcher_plogin",是个切换登录的全局唯一属性。同理我们再需要找到账号、密码输入框和点击登录的元素就可以用selenium模拟登录了

     

    登录部分代码如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    from selenium import webdriver

     

    driver = webdriver.Chrome()

        # 获取谷歌浏览器驱动

        driver = webdriver.Chrome()

        # 登录网站

        driver.get('https://i.qq.com')

        # 选择账号密码登录

        driver.switch_to_frame('login_frame')

        # 点击输入框获取输入

        driver.find_element_by_id('switcher_plogin').click()

        # 输入账号

        driver.find_element_by_id('u').send_keys('你的qq号')

        # 输入密码

        driver.find_element_by_id('p').send_keys('qq密码')

        # 点击登录

        driver.find_element_by_id('login_button').click()

      

    工作前的参数准备

    通过查看开发者工具中的请求我们发现,登录之后每次请求除了携带必要的参数以外,还携带了登录获取的token和g_tk。token我们可以从网页源代码中直接获取,但是g_tk在源代码中没有,根据以往经验第一步只能从js中查看,果然发现了一段加密代码,再结合上下文发现是从cookie中取出“p_skey”的值再经过一系列操作就是g_tk的值了。因为我们需要先获取cookie,然后再通过cookie获取g_tk。

    在这里插入图片描述

    部分js加密逻辑代码

    复制代码

    if (e) {
         if (e.host && e.host.indexOf("qzone.qq.com") > 0) {
            try {
               t = parent.QZFL.cookie.get("p_skey")
            } catch(e) {
               t = QZFL.cookie.get("p_skey")
            }
         } 
            ............
      }
    
    "g_tk=" + QZFL.pluginsDefine.getACSRFToken(t)
    
    QZFL.pluginsDefine.getACSRFToken._DJB = function(e) {
            var t = 5381;
            for (var n = 0,
            r = e.length; n < r; ++n) {
                t += (t << 5) + e.charCodeAt(n)
            }
            return t & 2147483647
        };

    复制代码

     

     

    获取token && cookie && g_tk代码

    复制代码

    """
     获取g_tk的值
    """
    def get_g_tk(cookie):
        hashes = 5381
        for letter in cookie['p_skey']:
            hashes += (hashes << 5) + ord(letter)
        return hashes & 0x7fffffff
    
    # 获取登录之后的cookie信息
    cookie = {}
    for elem in driver.get_cookies():
        cookie[elem['name']] = elem['value']
    # 获取g_tk
    g_tk = get_g_tk(cookie)
    # 利用xpath获取登录之后的网页源代码
    html = driver.page_source
    xpath = r'window\.g_qzonetoken = \(function\(\)\{ try\{return "(.*?)";}'
    # 通过xpath 获得登录后的token
    token = re.compile(xpath).findall(html)[0]

    复制代码

     

    开始搞事

    破解了一个简单的反爬虫,下面就可以编写正式的爬虫代码了,首先确定我们目标url、通过浏览器分析响应的json对象、编写headers

    因为每次请求都需要携带登录信息,为了方便我们用到了session类,其次观察相应我们发现返回的response有无用的字符,因此需要进行截取

    在这里插入图片描述

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    headers = {

        'authority''user.qzone.qq.com',

        'method''GET',

        'scheme''https',

        'accept-language''zh-CN,zh;q=0.9',

        'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',

    }

     

    def get_resp(cookie, g_tk, token, page):

        session = requests.session()

        # 将cookie字典转换成RequestsCookieJar

        = requests.utils.cookiejar_from_dict(cookie)

        # 将headers 放入session

        session.headers = headers

        # RequestsCookieJar复制给session

        session.cookies = c

        # 访问留言板的url

        url = f'https://user.qzone.qq.com/proxy/domain/m.qzone.qq.com/cgi-bin/new/get_msgb?uin={登陆的qq}&hostUin={要查询留言内容的QQ号}&start={page}&num=10&g_tk={g_tk}&qzonetoken={token}'

        print(url)

        response = session.get(url)

        # 截取无用的字符

        resp_text = response.text[10-3]

        # 转为json

        resp_json = json.loads(resp_text)

        return resp_json

      

     

    上面的方法,只是获得了某一页的接口相应,我们通过json获取留言总数,再除以每页的条数,就可以知道总页数了。然后再遍历去取每页的数据,为了方便查看将数据保存在csv文件中,另外将留言内容保存在txt文件中,生成词云。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    def get_zone_xx(cookie, g_tk, token, page=0):

        # 初始化请求为了取总条数

        resp_json = get_resp(cookie, g_tk, token, page)

        # 总条数

        total = resp_json['data']['total']

        print(f'共{total}条留言信息')

        # 总页数

        size = int(total/10 + 1)

        # 已经读取的信息条数

        use_page = 0

        # 保存每条数据信息,生成csv文件用

        content_arr = []

        for in range(0, size):

            # 请求每一页的内容

            resp_json = get_resp(cookie, g_tk, token, i)

            # 当条数大于或等于总条数 跳出循环

            if use_page >= total:

                break

            # 从每页数据中取出需要的字段值

            for comment in resp_json['data']['commentList']:

                use_page += 1

                print(f'当前正在读取第{use_page}条')

                page_json = []

                # 留言日期

                page_json.append(comment['pubtime'])

                # 昵称

                page_json.append(comment['nickname'])

                # 内容

                content = replace_html(comment['htmlContent'])

                # 将内容写入文本 生成词云用

                with open('zone_text111.txt''a') as f:

                    f.write(content)

     

                page_json.append(content)

                content_arr.append(page_json)

      

     

    生成csv文件

    1

    2

    3

    4

    5

    # 将总数据转化为data frame再输出

    df = pd.DataFrame(data=content_arr,

                          columns=['留言日期''昵称''留言内容'])

    df.to_csv('QQ_ZONE.csv', index=False, encoding='utf-8_sig')

    print('已保存为csv文件.')

      

    运行上面代码生成csv文件部分内容如下

     


    生成词云(wordcloud)代码如下

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    from wordcloud import WordCloud

    import matplotlib.pyplot as plt

    with open('zone_text.txt','r') as f:

        mytext = f.read()

     

    font = r'C:\Windows\Fonts\simfang.ttf'

    wc = WordCloud(collocations=False, font_path=font, width=1400, height=1400, margin=2).generate(mytext)

    plt.imshow(wc)

    plt.axis("off")

    plt.show()

     

    plt.show()

      

    运行结果如下:

     

    写在最后

    上面的代码并没有太复杂,也许是触景生情,也许是对现在朋友圈各种乱七八糟的信息产生了抵触,所以试着去回忆青春的那些往事。
    朋友圈和空间并不能去衡量一个人是是否成熟,但是对于大部分90后来说,空间真的是承载了太多纯真的回忆。不忘初心,砥砺前行!!!

    展开全文
  • 3.点击开启这个服务,就会得到一个授权码,这个需要保存好,相当于在程序运行过程中登录件人邮箱的一个动态密码。 简述POP3与SMTP是什么和其有什么区别? POP3:(Post Office Protocol 3),邮局协议的第三...

    前期准备:

    1.登录需要发送邮件的QQ邮箱,找到设置项

    2.然后在账户栏下,找到(POP3/SMTP)服务协议

    3.点击开启这个服务,就会得到一个授权码,这个需要保存好,相当于在程序运行过程中登录发件人邮箱的一个动态密码。

    简述POP3与SMTP是什么和其有什么区别?

    POP3:(Post Office Protocol 3),邮局协议的第三版本,规定了用户从个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。特点是接收邮件的协议

    SMTP:(Simple Mail Transfer Protocol),简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式,帮助每台计算机在发送或中转信件时找到下一个目的地。特点是发送邮件的协议

    代码实现QQ邮箱发送验证码

    先看一下这个图片,了解一下邮件发送的架构(本篇文章只说明发送文件)

    主要使用到的类

    Properties类:作用是创建Session对象,需要封装邮件传输使用的协议(mail.transport.protocol = smtp),发件人的SMTP服务器地址(mail,smtp.host =  smtp.qq.com ),传输的请求认证(mail.smtp.auth = true )

    Session类:

    • 创建:通过Session类的静态方法 public static Session getDefaultInstance(java.util.Properties props)(还有其他的几个方法,想了解查看JavaEE的API文档即可)
    • 获取Transport对象:public Transport getTransport()
    • 利用Session对象创建邮件对象:public MimeMessage(Session session)(MimeMessage的构造器)
    • public void setDebug(boolean debug) 查看debug信息

    MimeMessage(Message子类):

    • 创建:上面已说,利用Session对象创建
    • 设置发件人:public void setFrom(Address address)
    • 设置收件人:public void setRecipient(Message.RecipientType type, Address address)
    • 设置邮件主题:public void setSubject(String subject, String charset)
    • 设置邮件正文:public void setContent(Object o, String type)
    • 设置发送时间:public void setSentDate(java.util.Date d)
    • 设置保存:public void saveChanges()

    (当然API里面还封装了邮件的正文容器,但本文章不详细说明了。)

    InternetAddress(Address子类):

    • public InternetAddress(String address)  创建对象
    • public InternetAddress(String address, String personal, String charset)  创建对象

     

    首先给大家理清一下思路。

    1.导入相关的jar包,主要的jar包为mail.jar 和 activation.jar

    链接:https://pan.baidu.com/s/1wfPxmAVr2_a_k6kcY7KOFA 
    提取码:hglr 

    2.代码实现如下,包含步骤:

    package com.chengxi.mail;
    
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.Properties;
    
    public class MailUtils {
    
        public static void sendMassage(String from, String to) {
            //加载Properties配置文件
            InputStream inputStream = MailUtils.class.getClassLoader().getResourceAsStream("mail.properties");
            Properties properties = new Properties();
    
            try {
                //把配置文件的内容加载到内存
                properties.load(inputStream);
    
                //获取Session对象
                Session session = Session.getDefaultInstance(properties);
                session.setDebug(true);
    
                //创建邮件对象
                MimeMessage message = MailUtils.createMessage(session, from, to, CheckCode.getCheckCode());
    
                //创建Transport对象
                Transport transport = session.getTransport();
    
                //获取连接到邮件服务器
                transport.connect("xxxxx@qq.com" , "授权码");
    
                //发送信息
                transport.sendMessage(message, message.getAllRecipients());
    
                //关闭连接
                transport.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            } catch (MessagingException e) {
                e.printStackTrace();
            }
    
    
        }
    
    
        /**
         * 单独封装邮件对象
         * @param session 利用Session对象创建邮件对象
         * @param from 发件人的邮箱地址
         * @param to 收件人的邮箱地址
         * @param checkCode 验证码
         * @return 邮件对象
         */
        public static MimeMessage createMessage(Session session, String from, String to, String checkCode) {
            //创建邮件对象
            MimeMessage mimeMessage = new MimeMessage(session);
    
            try {
                //设置发件人
                mimeMessage.setFrom(new InternetAddress(from));
    
                //设置收件人
                //这个邮件可以发给多个收件人,因此有关get收件人的方法可以在发送时调用
                mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
    
                //设置邮件主题
                mimeMessage.setSubject("验证码检验", "utf-8");
    
                //设置正文
                mimeMessage.setContent(" 验证码为" + checkCode, "text/html;charset=utf-8");
    
                //设置发送时间
                mimeMessage.setSentDate(new Date());
    
                //保存改变
                mimeMessage.saveChanges();
    
                return mimeMessage;
            } catch (MessagingException e) {
                e.printStackTrace();
            }
            return  null ;
        }
    
    }
    

    其mail.properties文件如下

    #设置邮箱服务器
    mail.smtp.host=smtp.qq.com
    #设置传输协议
    mail.transport.protocol=smtp
    #设置传输请求认知
    mail.smtp.auth=true
    

    生产验证码

    package com.chengxi.mail;
    
    import java.util.Random;
    
    public class CheckCode {
    
        public static String getCheckCode() {
            Random random = new Random();
    
            String checkCode = "";
    
            for (int i = 0; i < 6; i++) {
                checkCode += random.nextInt(10) ;
            }
            return  checkCode ;
        }
    }
    
    

     

     

     

    展开全文
  • QQ空间,这个曾经陪我们从童年到少年再到成年,从2G时代再到如今的4G末,占据了我们太多的青春回忆,如今好友空间动态更新...,看到自己好几年前动态,说的傻话,自己都怕了自己。有时候看到好朋友几年前的动态...
  • 群消息可以配置推送到论坛某个接口上,以实现论坛弹幕或者动态聚合效果,请看 在论坛代码中调用小薇进行 QQ 消息推送,比如论坛有新帖时自动推送到 QQ 群 加小薇为好友后可通过暗号(key)让她群推消息 总之,如果你...
  • 群消息可以配置推送到论坛某个接口上,以实现论坛弹幕或者动态聚合效果,请看 在论坛代码中调用小薇进行 QQ 消息推送,比如论坛有新帖时自动推送到 QQ 群 加小薇为好友后可通过暗号(key)让她群推消息 总之,如果你...
  • Android热补丁技术方案整理

    千次阅读 2016-06-29 12:06:54
    紧急版,用户不一定升级,强制升级又不友好,有什么更好的解决方案呢?这就用到了热修复技术。 QQ团队的hotfix,后来发展成为RocooFix, GitHub地址: https://github.com/dodola/HotFix 原理详细介绍官方文章:安卓...
  • 之前,有什么动态,心情或者吐槽的,都会微博,或者QQ空间。但随着微信应用的普遍使用,最后,这些都被 「 微信朋友圈 」所替代,就像民间流传的一句话一样,现在连跳广场舞的大妈,在家做个菜都会到朋友圈...
  • 5.富文本   先说一下什么是富文本,富文本就是对文本中一些...有时候我们QQ聊天经常表情,其实这也是一种富文本。富文本,可以支持一部分的HTML,也可以动态添加的一些图片。     textFu=(TextView)findV...
  • 爱Q百宝箱 v2.9.zip

    2019-07-15 15:27:36
    12、说说自定义机型尾巴(装逼必备 什么iPhone 6 P弱爆了、直接随便改) 爱Q百宝箱 v2.9更新内容 新增:高清电视直播 3 新增:LOL战斗力查询 新增:官方网站 新增:QQ昵称大全 新增:在线翻译 新增:美图...
  • 有错的地方,或者不同意见的,烦请留言,或者邮箱。 邮箱地址:1746902011@qq.com ————————————————————————————————— 7,malloc/free和new/delete有什么区别? malloc/free...
  • 当我们查看QQ里面的的信息或者扫一扫等各种操作的时候,其实就开启了线程。 进程: 进程是系统正在运行的应用程序,程序一旦运行就是进程, 进程是资源分配和调度的最小单位。 程序是是一组指令的有序集合,...
  • 由于项目正在启步阶段,第一版预计3月底,后序会慢慢维护其他版本,有什么不到位的请大家担待〜 原始地址 gitee地址: ://gitee.com/liqianglog/django-vue-admin github地址: : 内置功能 用户管理:用户是系统...
  • 如果有什么新奇想法或有需要优化改进的地方可以我邮箱或者加我QQ387953660 执照 Copyright 2017 Sun Jian Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in...
  • java多态

    2018-06-07 19:26:43
    比如空格键,运行音乐播放器,打字的空格,qq发消息的空格,同一个事件发生在不同对象上会产生不同的结果。2.多态存在的必要条件?要有继承或者接口实现,要有方法的重写;父类引用指向了子类的对象。3,多态的好处?...
  • 每天上班打开电脑登上微信qq后,打开谷歌进入CSDN点开唯一的关注王富贵儿看她有没有动态,成了习惯已经超过21天了,今天照例打开发现有点奇怪,仔细看了看发现她的划水贴没了,博客日记也没了,是被领导看到了,还是...
  • Android-多线程 薛之涛 关注2018.07.02 23:12* 字数 2332 阅读 51评论 0喜欢 1一...进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,...
  • 回顾2010

    2011-02-09 21:15:16
    QQ上也几乎没有任何动态 这么久时间不牢骚还真不知道该写些什么了 想当初行云流水 下笔如有神     在经历过很多事情之后感觉自己更成熟了 不过压力也更大了 女朋友远在遥远的西边,我却在东边(还好不是...
  • 花田,或者网易花田,我不清楚他的具体成立...我还在当时了一段文字,就是“花田就是另一个QQ空间之类的”。 到现在为止,花田已经增加"搭讪广场",“Q&A问答”,还有一个改变就是,在动态那里终于不再出现...
  • 如果想给网站安装免费的手机短信通知系统请看, 功能:安装此软件可以把...有任何建议和意见请提交给QQ:350666582,我也是新学PHP,大家共同学习,大家有需要发布广告什么的请登录www.59info.com(群发免进,谢谢)。
  • 记几天内的感受

    2012-11-15 19:37:35
    QQ上都不怎么说说了,只是还是无聊地上去刷刷有什么动态,以满足自己的好奇感和无聊…… 这两天莫名的失落。。 上网在课上展示网站,早上六点爬起来继续赶工,直到我上讲台网站都还有很多没做好没做完的地方...
  •  为了兑现诺言,今天(正月十五网上23点30分)将它出来,其中可能还有一些瑕疵,我会慢慢改进,希望大家在使用的过程中有什么发现的话,告知于我,万分感谢,下一个版本 功能将更强大,而且我还会在桌面化的基础...
  • 网络监控软件

    2008-06-02 18:01:29
    一机安装,监控整个网络,网页过滤,P2P控制,BT控制,聊天控制,游戏控制,流量控制,内容记录(收发邮件包括WEB发送的邮件,上传下载文件包括QQ和MSN等外的文件),记录QQ聊天内容,SKYPE聊天内容,MSN聊天内容...
  • 不熟的还是不要玩了,反正我是没耐心了,对着电脑不知道骂了多少次了,这套搞笑GIF源码其实有三个大类,一个是图片类的搞笑GIF动态图,一个是文字类的搞笑段子网络流行语那种,还有一个图片类的搞笑表情跟QQ头像这三...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

qq动态发什么