整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          在網站copy時自帶的版權小尾巴以及“復制代碼“,可以怎么實現

          每天網上的博客各個領域都會涌現新文章,有時候看到感興趣的知識就想把某段文字 copy下來 摘錄下來,等有時間后慢慢品味

          在部分網站上,如果只是復制少量文字,并沒有什么不同。但是當我們復制的文字多的話會發現多了一個小尾巴

          所謂小尾巴是指在復制文本的最后會多一個作者和出處信息,如下:

          ···(復制的內容)···
          ————————————————
          版權聲明:本文為xxx的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
          原文鏈接:https://www.cnblogs.com/rainy-night/

          博客園可能并沒有這種情況,但是在很多技術論壇、博客都有這樣的處理。當我們復制文章內容的時候,往往會自動加上一段文本信息版權

          那么如果我們也想實現這樣的效果要怎么做呢?

          實現

          版權小尾巴

          前提:假定所選擇的字符串長度大于等于130時帶上版權信息

          <div id="copy">
            <div>示例一:這不是一個 bug,這只是一個未列出來的特性。</div>
            <div>
              示例二:ES6 是一個泛指,含義是 5.1 版以后的 JavaScript。
              ES6 是 JavaScript 語言的下一代標準,已經在 2015 年 6 月正式發布了。
              它的目標,是使得 JavaScript 語言可以用來編寫復雜的大型應用程序,使之成為企業級開發語言。
            </div>
          </div>
          
          <script>
          var copyEl = document.getElementById('copy');
          copyEl.oncopy = function (e) {
            if (window.getSelection(0).toString().length >= 130) {
              var clipboardData = event.clipboardData || window.clipboardData;
              // 阻止默認事件
              e.preventDefault();
              var copyMsg =
                window.getSelection() +
                '\r\n————————————————\r\n版權聲明:本文為xxx的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。' +
                '\r\n原文鏈接:' + location.href;
              // 將處理完的信息添加到剪切板
              clipboardData.setData('Text', copyMsg);
              // 將處理完的信息添加到剪切板
              clipboardData.setData('Text', copyMsg);
            }
          };
          </script>
          

          演示


          瀏覽器兼容性


          當復制示例一后可以發現粘貼是正常的;復制示例二則會在末尾攜帶版權信息

          復制代碼功能

          我們直接復制代碼,會發現當字數超過一定值時也是會攜帶版權信息。但是點擊“復制代碼”的時候可以一鍵復制區域內的代碼,這可以怎么實現呢?

          <div>
            <pre>
          <code id="copyable">// 浮點數相加
          function mathMultiply(arg1, arg2) {
            var m = 0;
            var s1 = arg1.toString();
            var s2 = arg2.toString();
            try {
              m += s1.split('.')[1].length; // 小數相乘,小數點后個數相加
            } catch (e) {}
            try {
              m += s2.split('.')[1].length;
            } catch (e) {}
            return (
              (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) /
              Math.pow(10, m)
            );
           }<code />
          </pre>
            <button id="btn">復制代碼</button>
          </div>
          
          <script>
            var btn = document.getElementById('btn');
            btn.onclick = function copyCode() {
              window.getSelection().removeAllRanges(); // 清除選中的文本
              var range = document.createRange();
              range.selectNode(document.getElementById('copyable'));
              var selection = window.getSelection();
              selection.addRange(range); // 添加選中的內容
              document.execCommand('copy'); // 執行復制
              window.getSelection().removeAllRanges(); // 清除復制選中的文本
              alert('代碼復制成功');
            };
          </script>
          

          演示


          瀏覽器兼容性


          document.execCommand()因為安全問題已經廢棄,不適合長期使用

          第三方工具

          除了以上實現方式,也可以使用第三方庫封裝好的函數來實現

          clipboard.js

          • 介紹:只有3k大小,不依賴任何框架
          • GitHub:https://github.com/zenorocha/clipboard.js

          文章來自https://www.cnblogs.com/rainy-night/p/16132466.html

          者:悅然wordpress建站(悅然建站)

          (此處已添加小程序,請到客戶端查看)

          繼續分享wordpress建站教程,今天教大家給網站的原創文章添加版權信息,能夠在一定程度上降低網站內容被采集的影響。


          ?這里給大家分享3種方法,大家可以根據自己的實際需求選擇使用。


          一、使用代碼


          wordpress建站使用的主題模板下都存在一個文件——single.php,這個文件就是用來控制文章內容顯示的,所以我們需要打開single.php文件,可以在寶塔面板中編輯,或者是通過FTP下載這個文件,然后用記事本編輯。


          <?php the_content(); ?>


          找到上面這行代碼。


          <script type="text/javascript">
           document.body.oncopy=function(){
           event.returnValue=false;
           var t=document.selection.createRange().text;
           var s="本文來源于<?php bloginfo('name'); ?> <?php echo get_settings('home'); ?> , 原文地址: <?php the_permalink() ?> ";
           clipboardData.setData('Text','\r\n'+t+'\r\n'+s+'\r\n');
           }
           </script>


          然后復制上面這段代碼,按它添加到剛才的代碼下方,最后保存。上面代碼中的中文說明可以自行修改。


          這段代碼實現的效果是:當用戶復制或采集您的企業網站內容時,會自動把文章的版本信息復制下來。


          二、使用插件


          wordpress也有很多實現版權說明的插件,下面給大家分享的插件為——wp-display-copyright-master,這個插件有點老的,但功能正常,使用也比較簡單。


          插件下載地址

          鏈接: https://pan.baidu.com/s/1Bce-dKJhnQATk90aVSnH2g 提取碼: ps48


          安裝好之后直接啟用就可以了。


          ?如果你不滿足插件默認的版本提示內容,你也可以在插件設置中修改,如上圖所示,參考上面的說明調整就可以了。


          三、手動添加


          不管是使用代碼還是插件,默認情況下都會給全站的文章都添加版權說明。如果你的企業網站內容全部都是原創的,這樣做沒有問題,但如果你的企業網站內容也是轉載的,那這樣做就不是太好,亂用版權申明也可能存在一些隱患哦。


          所以我們也可以嘗試手動添加版權說明,方法就是自己打字,在你的個別原創文章的開頭或結尾添加一段版權說明文字就可以了,這個方法適用于所有網站建設程序,比如你的企業網站建設使用的是H5模板建站系統、或者是DEDECMS、帝國CMS等可以。


          如果你使用的是wordpress的古騰堡編輯器,那么也可以配合它的可重用區塊使用,這樣可以在需要添加版權的直接調用,操作方法如下:


          1.先編輯好網站版權申明的內容。


          wordpress建站教程:古騰堡可重用區塊的使用


          2.然后添加上面的可重用區塊教程操作就可以了。


          小結:以上幾種方法大家根據實際情況使用即可,用不上的也沒必要強行使用了。大家可以觀察悅然wordpress建站官網,雖然我的網站內容基本都是原創,但是我并沒有添加版權說明。剛開始的時間我也遇到了一些惡心的抄襲者,但隨著網站收錄的提高,搜索引擎基本都可以識別出原創出處的,也就是說那些抄襲者對我基本沒太多影響。所以做好內容才是最重要的哦。


          總結


          以上就是今天給大家分享的wordpress建站教程,希望對您有用。?

          注:部分代碼參考作者 skyblue NG 博客修改,部分代碼在新的版本不適用,所以作了修改,在3.7上可以正常運行。)

          上節談到如何通過自動查找邊緣,獲取文檔輪廓來進行透視轉換的問題,在圖像文件比較清晰的情況下,這個轉換還是很簡單的,但是也存在先天的缺陷,就是實際應用所獲得的圖像并不是那么好獲取文檔輪廓,所以我們得另辟蹊徑來解決這個問題,方法就是通過人工鼠標選取需要轉換的區域來實現。這樣可以適用于大多數情況。

          整體的思路是這樣的:

          第一步:需要用到tkinter圖形界面,構建一個GUI用于圖像導入等操作

          第二步:定義鼠標事件,對導入的圖像選取ROI區域,這里通過鼠標標注ROI的四個角點坐標

          第三步:調用上一節使用到的transform and scan 程序,把scan程序修改成一個函數

          第四步:顯示結果

          看起來也不是很難,當然你得對tkinter有所了解,不過參照文檔理解這些代碼不難,而且我做了大量的注釋,盡量減少代碼理解的難度。關鍵是一定要自己動手驗證一下。

          馬上進入第一步:構建一個GUI窗體

          # -*- coding: utf-8 -*-
          from tkinter import *
          from tkinter.filedialog import askopenfilename #需要用到文件對話框
          import cv2
          import numpy as np
          from tkinter import ttk
          import win32clipboard as wcld
          import os
          from scan_module import wrapped
          root = Tk() # 創建根窗體
          frm1 = Frame(root) # 把frm1加載到根窗體中
          frm1.pack(side='top',anchor='e',ipadx=1,ipady=1) # 放置frm1框架的為止
          frm2 = Frame(root) # 加載第二個框架到根窗體
          frm2.pack(side='top',anchor='w',ipadx=1,ipady=3)
           
          root.title("ROI截取")
          Label(frm1,text="ROI截取 第一版",fg ="gray").pack(side="right") # 在框架1中加載一個標簽
          ttk.Button(frm2,text="打開文件",command=myopen).pack(side="left",ipadx=8) # 在框架2左邊加載一個按鈕并賦予按鈕事件
          ttk.Label(frm2,text=" 坐標:").pack(side="left",ipadx=0) # 在框架2左邊再加載一個標簽
          msg = StringVar()
          ttk.Entry(frm2,width=60, textvariable = msg).pack(side="left",ipadx=0) # 緊接著在框架2左邊再加載一個文本輸入框
          ttk.Button(frm2,text="復制",command=send_to_clibboard).pack(side="right",ipadx=3) # 在框架2右邊加載一個按鈕并賦予按鈕事件
           
          # 進入消息循環
          root.mainloop() # tkinter一般只有執行mainloop()方法才能運行,才能創建窗口
          

          構建完是這個樣子的:

          第二步:定義按鈕 ‘打開文件’ 事件,myopen() 函數

          filename = ""
          def myopen():
           global filename,img,ROI
           # 通過askopenfilename()方法直接獲取文檔名稱
           filename = askopenfilename(filetypes=(("Template files", "*.tplate"), ("HTML files", "*.html;*.htm"), ("All files", "*.*") ))
           print (filename)
           img = cv2.imread(filename)
           ROI = img.copy()
           
           # setMouseCallback()創建了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再抬起的過程,都會分3次調用鼠標響應函數
           # 這里調用的回調函數就是上面定義的on_mouse()函數,當鼠標激活打開的圖像時,執行相應的操作。
           cv2.namedWindow('src')
           cv2.setMouseCallback('src', on_mouse) 
           cv2.imshow('src', img)
           cv2.waitKey(0)
           cv2.destroyAllWindows()
          定義on_mouse() 函數:
          # -----------------------鼠標操作相關------------------------------------------
          lsPointsChoose = [] #選取點的坐標列表
          tpPointsChoose = [] 
          pointsCount = 0 #鼠標點擊的次數
          count = 0 
          pointsMax = 4 #初始化選取點的數量
          def on_mouse(event, x, y, flags, param):
           global img, point1, point2, count, pointsMax
           global lsPointsChoose, tpPointsChoose # 存入選擇的點
           global pointsCount # 對鼠標按下的點計數
           global img2, ROI_bymouse_flag
           img2 = img.copy() # 此行代碼保證每次都重新再原圖畫 避免畫多了
           
           if event == cv2.EVENT_LBUTTONDOWN: # 左鍵點擊
           pointsCount = pointsCount + 1
           print('pointsCount:', pointsCount)
           point1 = (x, y)
           print (x, y)
           # 畫出點擊的點
           cv2.circle(img2, point1, 10, (0, 255, 0), 2)
           
           # 將選取的點保存到list列表里
           lsPointsChoose.append([x, y]) # 用于轉化為array 提取多邊形ROI
           tpPointsChoose.append((x, y)) # 用于畫點
           # ----------------------------------------------------------------------
           # 將鼠標選的點用直線連起來
           print(len(tpPointsChoose))
           for i in range(len(tpPointsChoose) - 1):
           print('i', i)
           cv2.line(img2, tpPointsChoose[i], tpPointsChoose[i + 1], (0, 0, 255), 2)
           
           # ----------點擊到pointMax時可以提取去繪圖----------------
           if (pointsCount == pointsMax):
           # -----------繪制感興趣區域-----------
           cv2.line(img2, tpPointsChoose[0], tpPointsChoose[pointsMax-1], (0, 0, 255), 2) # 把多邊形封閉,最后一個點和起始點連接
           ROI_byMouse() # 調用繪制函數畫出感興趣區域
           ROI_bymouse_flag = 1
           
           i = 0
           pointsCount = 0
           tpPointsChoose = []
           lsPointsChoose = []
           
           cv2.imshow('src', img2)
           # -------------------------右鍵按下清除軌跡-----------------------------
           if event == cv2.EVENT_RBUTTONDOWN: # 右鍵點擊
           print("right-mouse")
           pointsCount = 0
           tpPointsChoose = []
           lsPointsChoose = []
           cv2.imshow('src', img2)
          
          再定義ROI_byMouse()函數
          
          def ROI_byMouse():
           global src, ROI, ROI_flag, mask2, lsPointsChoose, msg
           mask = np.zeros(img.shape, np.uint8)
           #print(lsPointsChoose)
           
           msg.set(lsPointsChoose)# 儲存選擇點坐標的列表到msg變量
           #print(msg.get())
           pts = np.array([lsPointsChoose], np.int32) # pts是多邊形的頂點列表(頂點集)
           pts = pts.reshape((-1, 1, 2))
           #print(pts)
           # 這里 reshape 的第一個參數為-1, 表明這一維的長度是根據后面的維度的計算出來的。
           # OpenCV中需要先將多邊形的頂點坐標變成頂點數×1×2維的矩陣,再來繪制
           
           # --------------畫多邊形---------------------
           #mask = cv2.polylines(mask, [pts], True, (255, 255, 255))
           # -------------填充多邊形---------------------
           mask2 = cv2.fillPoly(mask, [pts], (255, 255, 255))
           #cv2.imshow('mask', mask2)
           cv2.imwrite('mask.bmp', mask2)
           ROI = cv2.bitwise_and(mask2, img)
           wrap_img = wrapped(ROI)
           cv2.imwrite('ROI.bmp', ROI)
           cv2.imshow('ROI', ROI)
           cv2.imshow('wrap_image',wrap_img)
          

          本例中還定義了一個 send_to_clibboard() 復制到剪切板函數用于查看選取的四個角點的坐標,主要用來驗證效果,其實可以不用。不過你可以參考。

          def send_to_clibboard():
           wcld.OpenClipboard()
           wcld.EmptyClipboard()
           wcld.SetClipboardData(wcld.CF_UNICODETEXT, msg.get()) # 此處使用.CF_UNICODETEXT方法才能正常解析
           wcld.CloseClipboard()
          

          把上一篇的scan.py修改成scan_module()模塊用來調用:

          # 導入必要的庫
          #導入上一節構建的模塊和函數
          from transform import four_point_transform
          #記得安裝scikit-image包,threshold-local函數幫助我們處理黑白圖像
          from skimage.filters import threshold_local 
          import numpy as np
          import argparse
          import cv2
          #imutils是一個很實用的圖像處理庫,比如resize/cropping/rotate等圖像基本編輯
          import imutils
          #這個module直接返回轉換后的圖像,用于其它程序調用
          def wrapped(image):
          	# 第一步
          	# 加載圖像并計算新舊圖像高度的比例,并拷貝一份,修改大小。
          	# 為了加快圖像處理速度,同時使邊緣檢測步驟更加準確,
          	# 我們將掃描圖像的高度調整為500像素。
          	# 我們還特別注意跟蹤圖像的原始高度與新高度的比值,
          	# 這將允許我們對原始圖像而不是調整大小的圖像執行掃描。
          	#img = cv2.imread(image)
          	img = image
          	ratio = img.shape[0] / 500.0
          	orig = img.copy()
          	img = imutils.resize(img, height = 500)
          	 
          	# 把圖象轉化為灰度, 并加模糊處理,然后查找邊緣
          	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          	gray = cv2.GaussianBlur(gray, (5, 5), 0)
          	edged = cv2.Canny(gray, 70, 250)
          	 
          	# 顯示原始圖像和檢測到的邊緣圖像,不需要顯示
          	#print("STEP 1: Edge Detection")
          	#cv2.imshow("Image", img)
          	#cv2.imshow("Edged", edged)
          	#cv2.waitKey(0)
          	#cv2.destroyAllWindows()
          	# 第二步
          	# 在邊緣圖像的基礎上查找輪廓保留最大的一個,并在圖像中標識出來
          	cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
          	cnts = imutils.grab_contours(cnts)
          	cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
          	 
          	# 循環處理
          	for c in cnts:
          		# 大致輪廓
          		peri = cv2.arcLength(c, True)
          		approx = cv2.approxPolyDP(c, 0.02 * peri, True)
          	 
          		# 如果查找的大致輪廓有四個角點,即假設為我們需要查找的
          		if len(approx) == 4:
          			screenCnt = approx
          			break
          	 
          	# 顯示文檔的輪廓在這個模塊中不需要顯示
          	#print("STEP 2: Find contours of paper")
          	#cv2.drawContours(img, [screenCnt], -1, (0, 255, 0), 2)
          	#cv2.imshow("Outline", img)
          	#cv2.waitKey(0)
          	#cv2.destroyAllWindows()
          	# 第三步
          	# 應用四點轉換生成鳥瞰圖
          	warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)
          	 
          	# 把變形的圖像轉化成灰度
          	warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
          	T = threshold_local(warped, 11, offset = 10, method = "gaussian")
          	warped = (warped > T).astype("uint8") * 255
          	return warped
          

          該函數返回轉換后的圖像。

          好了,我們測試一下效果

          查看一下視頻,演示測試過程:

          效果非常好。趕緊動起手來,設計一個屬于自己的文檔掃描儀吧。下一次嘗試一下OCR,文本識別和輸出。這個比較有挑戰。


          主站蜘蛛池模板: 51视频国产精品一区二区| 久久国产香蕉一区精品| 精品国产一区AV天美传媒| 肉色超薄丝袜脚交一区二区| 手机看片一区二区| 久久精品黄AA片一区二区三区| 亚洲av无码天堂一区二区三区| 精品成人av一区二区三区| 国产成人亚洲综合一区| 中文字幕在线一区| 最新中文字幕一区二区乱码| 任你躁国产自任一区二区三区| 亚洲AV无码一区二区三区牛牛| 国精品无码A区一区二区| 国产一区二区三区樱花动漫| 中文字幕av无码一区二区三区电影| 日韩中文字幕精品免费一区| 精品性影院一区二区三区内射| 久久精品国产第一区二区| 日本精品一区二区久久久| 国产精品亚洲一区二区三区| 高清一区二区三区日本久| 中文字幕精品无码一区二区 | 亚洲狠狠久久综合一区77777| 国偷自产视频一区二区久| 蜜芽亚洲av无码一区二区三区| 在线观看国产一区二三区| 日韩精品区一区二区三VR| 亚洲国产精品一区| 国产对白精品刺激一区二区| 无码人妻精品一区二区三区99性| 一区二区免费视频| 亚洲国产精品一区二区成人片国内| 国产在线精品一区二区在线观看| 日本大香伊一区二区三区| 久久久精品人妻一区二区三区 | 精品一区精品二区制服| 日韩一区二区a片免费观看| 日本一区二区三区日本免费| 国产伦精品一区二区三区四区| 国产精品毛片一区二区|