def pingback_ping(self): source = self.params[0] target = self.params[1] slug = target.split('/')[-2] try: entry = Entry.objects.get(slug=slug) if not entry.allow_comments: raise Entry.DoesNotExist except Entry.DoesNotExist: return XmlRpcDispatcher.fault(33, 'The specified URI cannot be used as target') try: Comment.objects.get(entry=entry, type__in=['P', 'T'], author_uri=source) return XmlRpcDispatcher.fault(48, 'The pingback has already been registered') except Comment.DoesNotExist: pass s = Spider(source) if not s.backlinks(target): if s.code == 200: return XmlRpcDispatcher.fault(17, 'The source URI does not contain a link to the target URI') return XmlRpcDispatcher.fault(16, 'The source URI does not exist') Comment.objects.create(entry=entry, type='P', author=hostname_from_uri(source, http=False), author_uri=source, body='') return XmlRpcDispatcher.pingback_reply('Pingback stored')
def ping(self): r = re.compile('<a.*?href=["\'](.*?)["\'].*?>', re.I | re.S) for anchor in r.finditer(self.body_html): link = anchor.group(1) if link.startswith(settings.BLANGO_URL): continue s = Spider(link) if not s.trackback(title=self.title, url=self.get_absolute_url(), excerpt=self.body_html, page_name=settings.BLANGO_TITLE): s.pingback(self.get_absolute_url())
def save(self, *args, **kwargs): spider = Spider(self.link) if 'html' in spider.oembed: self.pre_html = '<div class="entry-embed">%s</div>' % \ spider.oembed['html'] elif spider.oembed.get('type') == 'photo': self.pre_html = '<div class="entry-embed"><img alt="%(title)s" ' \ 'src="%(url)s" width="%(width)s" height="%(height)s" />' \ '</div>' % spider.oembed elif not self.thumbnail: thumbnail = None thumbnail_size = (0, 0) required_attrs = ('src', 'alt', 'width', 'height') for img in spider.soup.xpath('//img'): if all (k in img.attrib for k in required_attrs): width, height = int(img.get('width')), int(img.get('height')) if width * height > reduce(lambda x, y: x * y, thumbnail_size): thumbnail = img thumbnail_size = (width, height) # Try to fetch a thumbnail if thumbnail is not None: THUMBNAIL_SIZE = 150 img_url = thumbnail.get('src') img_data = spider.fetch(img_url) im = Image.open(StringIO(img_data)) im.thumbnail((THUMBNAIL_SIZE, THUMBNAIL_SIZE)) buf = StringIO() im.save(buf, format=im.format) self.thumbnail.save(os.path.basename(img_url), ContentFile(buf.getvalue())) buf.close() result = urlparse.urlparse(self.link) self.post_html = _('<h4>From <a href="%s">%s</a></h4>') % \ (self.link, result.netloc) if not self.title: self.title = spider.oembed.get('title') or spider.get_title() super(LinkEntry, self).save(*args, **kwargs)
def trackback_view(request, entry_id): title = request.POST.get('title') excerpt = request.POST.get('excerpt', '') url = request.POST.get('url') blog_name = request.POST.get('blog_name') if not url: return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>1</error> <message>No URL specified</message> </response>''', mimetype='text/xml') if len(url) > 1024: return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>1</error> <message>Entity Too Large</message> </response>''', mimetype='text/xml') if not is_absolute_link(url): return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>1</error> <message>URL must match https?://.*</message> </response>''', mimetype='text/xml') entry = get_object_or_404(Entry, pk=entry_id) if not entry.allow_comments: return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>1</error> <message>Trackbacks are not allowed for this entry</message> </response>''', mimetype='text/xml') try: Comment.objects.get(entry=entry, type__in=['T', 'P'], author_uri=url) return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>1</error> <message>Trackback already registered</message> </response>''', mimetype='text/xml') except Comment.DoesNotExist: pass s = Spider(url) if not s.backlinks(entry.get_absolute_url()): return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>1</error> <message>URL doesn't link back</message> </response>''', mimetype='text/xml') if not blog_name: blog_name = url.split('/')[2] if title: excerpt = '%s\n\n%s' % (title, excerpt) Comment.objects.create(entry=entry, author=blog_name, author_uri=url, body=excerpt, type='T') return HttpResponse('''<?xml version="1.0" encoding="utf-8"?> <response> <error>0</error> </response>''')