bremen_short_url/BackEnd/api/getMeta.ashx

136 lines
5.2 KiB
Plaintext

<%@ WebHandler Language="C#" Class="getMeta" %>
using System;
using System.Web;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Web.Services.Protocols;
using System.Security.Cryptography;
using System.Text;
using System.Web.SessionState;
using System.Data;
using System.Collections.Generic;
using System.IO.Compression;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class getMeta : IHttpHandler, IReadOnlySessionState {
private string _baseurl = HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.ApplicationPath.TrimEnd('/');
public void ProcessRequest (HttpContext context) {
result objRet = new result();
DataContractJsonSerializer json = new DataContractJsonSerializer(objRet.GetType());
context.Response.ContentType = "application/json;charset=utf-8";
context.Response.AddHeader("Access-Control-Allow-Origin", "*");
string acceptEncoding = context.Request.Headers["Accept-Encoding"].ToString().ToUpperInvariant();
if (!String.IsNullOrEmpty(acceptEncoding))
{
if (acceptEncoding.Contains("GZIP"))
{
//输出流头部GZIP压缩
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
//输出流头部DEFLATE压缩
context.Response.AppendHeader("Content-encoding", "deflate");
context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
}
}
authPermission objAuth = new authPermission();
if (!objAuth.isLogin())
{
objRet.ret = "no";
objRet.err_code = "0001";
objRet.message = "尚未登入,請登入後使用";
json.WriteObject(context.Response.OutputStream, objRet);
return;
}
string url = (context.Request["url"] == null) ? "" : context.Request["url"].ToString();
if (url == "") {
objRet.ret = "no";
objRet.err_code = "0001";
objRet.message = "無傳入網址!\n";
json.WriteObject(context.Response.OutputStream, objRet);
return;
}
string htmlData = globalClass.getPageData(url);
//htmlData = htmlData.Replace("\n", "");
Match ogTitleMatch = Regex.Match(htmlData, "<meta.*?property=\"og:title\".*?content=\"([^<]*)\".*?([^<]*)>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
Match ogDescMatch = Regex.Match(htmlData, "<meta.*?property=\"og:description\" content=\"([^<]*)\".*?([^<]*)>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
Match ogImageMatch = Regex.Match(htmlData, "<meta.*?property=\"og:image\".*?content=\"([^<]*)\".*?([^<]*)>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string ogTitle = ogTitleMatch.Groups[1].Value;
string ogDesc = ogDescMatch.Groups[1].Value;
string ogImage = ogImageMatch.Groups[1].Value;
if (ogTitle == "") {
ogTitleMatch = Regex.Match(htmlData, "<meta.*?name=\"og:title\".*?content=\"([^<]*)\".*?([^<]*)>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
ogDescMatch = Regex.Match(htmlData, "<meta.*?name=\"og:description\" content=\"([^<]*)\".*?([^<]*)>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
ogImageMatch = Regex.Match(htmlData, "<meta.*?name=\"og:image\".*?content=\"([^<]*)\".*?([^<]*)>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
ogTitle = ogTitleMatch.Groups[1].Value;
ogDesc = ogDescMatch.Groups[1].Value;
ogImage = ogImageMatch.Groups[1].Value;
}
objRet.ret = "yes";
objRet.ogTitle = ogTitle;
objRet.ogDescript = ogDesc;
if (objRet.ogDescript.Length > 100) {
objRet.ogDescript = objRet.ogDescript.Substring(0, 95) + "...";
}
string imageName = "";
if (ogImage != "") {
imageName = globalClass.CreateRandomCode(24);
string filePath = string.Format("/downloads/{0}.png", imageName);
string path = System.Web.HttpContext.Current.Server.MapPath("~/");
try
{
globalClass.getUrlPic(ogImage).Save(path + filePath.Replace("/", "\\"), ImageFormat.Png);
objRet.ogImage = _baseurl + "/downloads/" + imageName + ".png";
}
catch (Exception ex)
{
objRet.ogImage = "";
}
}
json.WriteObject(context.Response.OutputStream, objRet);
return;
}
public class result
{
public string ret = "no";
public string err_code = "0000";
public string message = "";
public string ogTitle = "";
public string ogDescript = "";
public string ogImage = "";
}
public bool IsReusable {
get {
return false;
}
}
}