Django SEO:自动推送百度、神马代码

网站的时候都希望程序可以携带很多附近功能,可以减少我们的劳动量。比如我们在做SEO的时候,就经常需要向搜索引擎推送链接。在日常的工作当中,我们推送的方式一般有两种,一种是我们编辑、发布一条就推送一条,另一种是每天定时推送。每天定时推送的例子,我们在soogor应用市场发布过,需要的朋友可以自行下载分析或改写。本文就来分享一下Django自动推送百度和神马的代码。

推送链接的获得大家可以参考本站其他文章。

veiws.py

import datetime
from django.apps import apps
from urllib.parse import urlsplit

def posturl(request,appmodel):
    #查对应的model
    appres=appmodel.split('_')
#得到model
    model = apps.get_app_config(appres[0]).get_model(appres[1])
    # 如果是https则为True,反之为False
    http = urlsplit(request.build_absolute_uri(None)).scheme
    # 获得当前的HTTP或HTTPS
    host = request.META['HTTP_HOST']
    siteurl = http + '://' + host + '/'
#得到最新内容
    obj=model.objects.filter(Status=99).order_by('-UpdateTime').first()

    if 'Article' in appmodel:
#cf 是我获得config.ini的实例
#SiteNode 是我的栏目model
#这就是个来拼接内容页链接的代码,自己根据需要来改
        nodeurltype=cf.get("Personality", "sgurl")
        if nodeurltype=='2':
            node_obj=SiteNode.objects.get(pk=obj.Node_id)
            url='{}/{}.html'.format(node_obj.NodeDir,obj.pk)
        elif nodeurltype=='1':
            url='{}.html'.format(obj.pk)
        else:
            url='{}'.format(obj.pk)
    print('posturl============',url)
#通过cf来得到一些推送开关和推送地址
    baidukey=cf.get('PostSet', 'baidukey')
    baiduurl=cf.get('PostSet', 'baiduurl')
    smkey=cf.get('PostSet', 'smkey')
    smurl=cf.get('PostSet', 'smurl')
    bingkey=cf.get('PostSet', 'bingkey')
    bingurl=cf.get('PostSet', 'bingurl')
    url=siteurl+url
    if url==siteurl:
        return
    print('baidukey===========',baidukey)
    logpath = os.path.join(settings.BASE_DIR, 'sg_system/websetting/post.log')
    if baidukey=='1':
        print('百度推送')
        headers = {
                    'User-Agent': 'curl/7.12.1',
                    'Host': 'data.zz.baidu.com',
                    'Content-Type': 'text/plain',
                    'Content-Length': '83'
                }
        # 先试推一条,得到总还可以推多少条
        data=url+'\n'
                        
        response = requests.post(url=baiduurl, data=data, headers=headers)
        print('response.text==========',response.text)
        canpost_num=json.loads(response.text)["remain"]
        print('canpost_num============',canpost_num,type(canpost_num))
        if 'success' in response.text:
            allline = ['时间:{0},百度成功推送:{1}剩余:{2}.内容:{3}链接{4}'.format(datetime.datetime.now(), json.loads(response.text)['success'],json.loads(response.text)['remain'],obj.Title,url+ '\n',) ]
        else:
            allline = ['时间:{0},百度结果{1}'.format(datetime.datetime.now(), response.text) + '\n', ]
        try:
            with open(logpath, 'r', encoding='utf-8') as file:
                allline += file.readlines()
        except:
            pass
        with open(logpath, 'w', encoding='utf-8') as file:
            for i in allline:
                if i == '':
                    pass
                else:
                    file.write(i.encode('utf-8').decode('utf-8'))
        if "not_same_site" in response.text:
            messages.add_message(request, messages.ERROR, '百度推送地址不正确')

        messages.add_message(request, messages.SUCCESS, '本次百度成功推送{0},剩余{1}.内容:{2}链接{3}'.format(json.loads(response.text)["success"],json.loads(response.text)["remain"],obj.Title,url))
    if smkey=='1':
        """
        推送成功
        {
            "returnCode" : 200, //接收成功,但需要进一步校验提交的内容是否正确
            "errorMsg" : ""
        }
        推送失败
        {
            "returnCode" : 201, // 201: token不合法; 202: 当日流量已用完; 400: 请求参数有误; 500: 服务器内部错误
            "errorMsg" : ""
        }
        """
        print('神推送')
        headers = {
                    'User-Agent': 'curl/7.12.1',
                    'Host': 'data.zhanzhang.sm.cn',
                    'Content-Type': 'text/plain',
                    'Content-Length': '83'
                }
        # 先试推一条,得到总还可以推多少条
        data=url+'\n'
                        
        response = requests.post(url=smurl, data=data, headers=headers)
        print('response.text==========',response.text)
#然后我们将结果写入日志文件中
        if json.loads(response.text)['returnCode']==200:
            allline = ['时间:{0},神马成功推送1条。内容:{1}链接{2}'.format(datetime.datetime.now(),obj.Title,url+ '\n',) ]
        else:
            allline = ['时间:{0},神马结果失败'.format(datetime.datetime.now()) + '\n', ]
        try:
            with open(logpath, 'r', encoding='utf-8') as file:
                allline += file.readlines()
        except:
            pass
        with open(logpath, 'w', encoding='utf-8') as file:
            for i in allline:
                if i == '':
                    pass
                else:
                    file.write(i.encode('utf-8').decode('utf-8'))
        messages.add_message(request, messages.SUCCESS, '时间:{0},神马成功推送1条。内容:{1}链接{2}'.format(datetime.datetime.now(),obj.Title,url))

上面就是一个整理出来的推送代码。有关这段代码的解释在下方。

然后我们需要在每次编辑、或发布的时候推送,所以我要用到model的save()方法

admin.py

from app.views import posturl #引用推送函数 from app的视图中的posturl函数
class ArcticleAdmin(admin.ModelAdmin):
...

    def save_model(self, request, obj, form, change):
                    
        obj.save()
        posturl(request,'article_Article')
        
admin.site.register(models.Article,ArcticleAdmin)

posturl(request,'article_Article') 就是我们推代码,

因为我想顺便向admin界面发布一条message所以我就用的request,如果你不需要这个message,也可以不用request参数

article_Article 这个str是一个多模板的使用方法,

article是app名

Article是model模型名

根据

这样什么样的模型都可以推送了

然后我们再写一段查看日志的代码

html

<a class="float-end ms-3" href="javascript:;" onclick="showlog()">任务日志</a>
 <!-- Modal -->
<div class="modal fade" id="exampleModal2" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg modal-dialog-centered" >
      <div class="modal-content">
        <div class="modal-body">
            <div class="text-center d-flex align-items-center justify-content-center"><span class="spinner-border text-success me-3"></span>获取日志。。</div>
        </div>
      </div>
    </div>
  </div>
    <script>
        function showlog() {
        $('#exampleModal2').modal('show')
        $.ajax({
           type: "get",
           url: "/admin/websetting/postset/getlog",
           data: "", //第一种方式传参
           success: function(msg){
             data=msg.data
               html=``
               $.each(data,function (x,y) {
                   console.log(x,y)
                   html+=`<li class="list-group-item list-group-item-action" style="word-break:break-all">`+y+`</li>`
               })
               html=`<ul class="list-group w-100">`+html+`</ul>`
               $('#exampleModal2 .modal-body').html(html)
           }
        });
    }    

    </script>

THE END