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